C/C++ 函數(shù)指針
函數(shù)聲明
例如:
float?func(int,?int);
以上就是一個(gè)函數(shù)的聲明,要注意它的實(shí)際功能并沒(méi)有被實(shí)現(xiàn),換句話說(shuō)就是它并沒(méi)有被定義,只是聲明此函數(shù)的存在。要想調(diào)用次函數(shù),你必須對(duì)對(duì)此函數(shù)進(jìn)行定義。例如,可以定義如下:
float?func(int?a,?int?b){
??return?(float)(a+b);
}float func(int,int); 在計(jì)算機(jī)語(yǔ)言里被叫做表達(dá)式,此表達(dá)式說(shuō)明func(int,int)返回的是一個(gè)float的數(shù),func是函數(shù)地址(特別注意,他不是指針,而是函數(shù)在內(nèi)存中的地址),它可以接受兩個(gè)int型的數(shù)據(jù)作為傳入?yún)?shù)。
函數(shù)指針
下面就是一個(gè)函數(shù)指針:
float?(*pf)(int,int);
這里pf就是一個(gè)函數(shù)指針變量,他可以接受的參數(shù)是兩個(gè)int,返回值為float。所以這個(gè)函數(shù)指針變量可以存放返回值為float,并且接受兩個(gè)int為傳入?yún)?shù)的函數(shù)地址。
我們可以做如下賦值運(yùn)算:
pf?=?func;
調(diào)用func函數(shù)也就可以寫成pf(…).
實(shí)驗(yàn)
實(shí)驗(yàn)代碼如下:
#include#includefloat?func(int,?int);
int?main(int?argc,?char**?argv){
????float?(*pf)(int,?int);
????pf?=?func;
????printf("%fn",?pf(1,?2));
????printf("%.16Xn",?(uint64_t)(pf));
????printf("%.16Xn",?(uint64_t)(func));
????printf("%.16Xn",?(uint64_t)(&func));
????printf("%.16Xn",?(uint64_t)(&pf));
????return?0;
}
float?func(int?a,?int?b){
????return?(float)(a?+?b);
}其中一次執(zhí)行結(jié)果如下:
3.000000 0000000025051005 0000000025051005 0000000025051005 000000004547FD08
注意輸出結(jié)果的第二行,第三行以及第四行是相同的;最后一行與這三行是不同的。這說(shuō)明:
bf這個(gè)變量存放的內(nèi)容是func的內(nèi)容。func本身就是地址,所以取地址符號(hào)并沒(méi)有對(duì)輸出值產(chǎn)生影響。bf本身是個(gè)存放地址的變量,他自己也有地址,他的地址就是輸出結(jié)果的最后一行。





