資源描述:
《c語言函數(shù)指針與指針函數(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、【函數(shù)指針】??????在程序運(yùn)行中,函數(shù)代碼是程序的算法指令部分,它們和數(shù)組一樣也占用存儲(chǔ)空間,都有相應(yīng)的地址??梢允褂弥羔樧兞恐赶驍?shù)組的首地址,也可以使用指針變量指向函數(shù)代碼的首地址,指向函數(shù)代碼首地址的指針變量稱為函數(shù)指針。1.函數(shù)指針定義函數(shù)類型(*指針變量名)(形參列表);“函數(shù)類型”說明函數(shù)的返回類型,由于“()”的優(yōu)先級(jí)高于“*”,所以指針變量名外的括號(hào)必不可少,后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。例如:int(*f)(intx);double(*ptr)(doublex);在定義函數(shù)指針時(shí)請(qǐng)注意:???函數(shù)指針和
2、它指向的函數(shù)的參數(shù)個(gè)數(shù)和類型都應(yīng)該是—致的;函數(shù)指針的類型和函數(shù)的返回值類型也必須是一致的。2.函數(shù)指針的賦值函數(shù)名和數(shù)組名一樣代表了函數(shù)代碼的首地址,因此在賦值時(shí),直接將函數(shù)指針指向函數(shù)名就行了。例如,intfunc(intx);??/*聲明一個(gè)函數(shù)*/int(*f)(intx);???/*聲明一個(gè)函數(shù)指針*/f=func;???????????/*將func函數(shù)的首地址賦給指針f*/賦值時(shí)函數(shù)func不帶括號(hào),也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。3.通過函數(shù)指針調(diào)用函數(shù)函數(shù)指
3、針是通過函數(shù)名及有關(guān)參數(shù)進(jìn)行調(diào)用的。與其他指針變量相類似,如果指針變量pi是指向某整型變量i的指針,則*p等于它所指的變量i;如果pf是指向某浮點(diǎn)型變量f的指針,則*pf就等價(jià)于它所指的變量f。同樣地,*f是指向函數(shù)func(x)的指針,則*f就代表它所指向的函數(shù)func。所以在執(zhí)行了f=func;之后,(*f)和func代表同一函數(shù)。由于函數(shù)指針指向存儲(chǔ)區(qū)中的某個(gè)函數(shù),因此可以通過函數(shù)指針調(diào)用相應(yīng)的函數(shù)?,F(xiàn)在我們就討論如何用函數(shù)指針調(diào)用函數(shù),它應(yīng)執(zhí)行下面三步:首先,要說明函數(shù)指針變量。例如:int(*f)(intx);其次,要對(duì)函數(shù)指針變量賦值。
4、例如:f=func;???(func(x)必須先要有定義)最后,要用(*指針變量)(參數(shù)表);調(diào)用函數(shù)。例如:???(*f)(x);(x必須先賦值)【例】任意輸入n個(gè)數(shù),找出其中最大數(shù),并且輸出最大數(shù)值。main(){???????intf();???????inti,a,b;???????int(*p)();???/*定義函數(shù)指針*/???????scanf("%d",&a);???????p=f;???????????/*給函數(shù)指針p賦值,使它指向函數(shù)f*/???????for(i=1;i<9;i++)???????{?????????????
5、??scanf("%d",&b);???????????????a=(*p)(a,b);???/*通過指針p調(diào)用函數(shù)f*/???????}???????printf("TheMaxNumberis:%d",a)}f(intx,inty){???intz;???z=(x>y)?x:y;???return(z);}運(yùn)行結(jié)果為:343-45438942351-534988555789↙TheMaxNumberis:4389【指針函數(shù)】一個(gè)函數(shù)不僅可以帶回一個(gè)整型數(shù)據(jù)的值,字符類型值和實(shí)型類型的值,還可以帶回指針類型的數(shù)據(jù),使其指向某個(gè)地址單元。?????
6、??返回指針的函數(shù),一般定義格式為:???????類型標(biāo)識(shí)符???*函數(shù)名(參數(shù)表)int*f(x,y);其中x,y是形式參數(shù),f是函數(shù)名,調(diào)用后返回一個(gè)指向整型數(shù)據(jù)的地址指針。f(x,y)是函數(shù),其值是指針。如:char*ch();表示的就是一個(gè)返回字符型指針的函數(shù),請(qǐng)看下面的例題:【例】將字符串1(str1)復(fù)制到字符串2(str2),并輸出字符串2.#include"stdio.h"main(){???char*ch(char*,char*);???charstr1[]="Iamgladtomeetyou!";???charstr2[]="W
7、elcomtostudyC!";???printf("%s",ch(str1,str2));}char*ch(char*str1,char*str2){???inti;???char*p;???p=str2??????if(*str2==NULL)exit(-1);???do???{???????*str2=*str1;???????str1++;???????str2++;???}while(*str1!=NULL);???return(p);}通過分析可得函數(shù)指針是一個(gè)指向函數(shù)的指針,而指針函數(shù)只是說明他是一個(gè)返回值為指針的函數(shù),函數(shù)指針可以用
8、來指向一個(gè)函數(shù)。