函數(shù)指針的含義
如果在程序中定義了一個(gè)函數(shù),那么在編譯時(shí)系統(tǒng)就會(huì)為這個(gè)函數(shù)代碼分配一段存儲(chǔ)空間,這段存儲(chǔ)空間的首地址稱為這個(gè)函數(shù)的地址。而且函數(shù)名表示的就是這個(gè)地址。既然是地址我們就可以定義一個(gè)指針變量來(lái)存放,這個(gè)指針變量就叫作函數(shù)指針變量,簡(jiǎn)稱函數(shù)指針。
函數(shù)指針的表示
函數(shù)指針的含義是一個(gè)指針指向某個(gè)函數(shù),根據(jù)含義可以表示為:
int(char, int) *p
但是這樣寫(xiě)不符合指針使用習(xí)慣,根據(jù)指針的表示原則是變量右邊的優(yōu)先級(jí)更高,我們可以將上面的函數(shù)指針改寫(xiě)為
int (*p)(char, int)
首先它是一個(gè)指針變量,所以要有一個(gè)“”,即(p);其次前面的 int 表示這個(gè)指針變量可以指向返回值類(lèi)型為 int 型的函數(shù);后面括號(hào)中的char和int 表示這個(gè)指針變量可以指向有兩個(gè)參數(shù)分別為char和int的函數(shù)。所以合起來(lái)這個(gè)語(yǔ)句的意思就是:定義了一個(gè)指針變量 p,該指針變量可以指向返回值類(lèi)型為 int 型,且有兩個(gè)整型參數(shù)的函數(shù)。p 的類(lèi)型為 int(*)(char,int)。
因此函數(shù)指針的一般形式為:
函數(shù)返回值類(lèi)型 (* 指針變量名) (函數(shù)參數(shù)列表);
函數(shù)指針的使用
函數(shù)指針的使用涉及到函數(shù)指針的定義,函數(shù)指針的賦值,函數(shù)指針的調(diào)用
int add(int a, int b)
{
return a + b
}
int (*p)(int, int);//定義
p = add; //賦值
p(10, 20) //調(diào)用
函數(shù)指針的強(qiáng)制類(lèi)型轉(zhuǎn)換
函數(shù)指針的賦值過(guò)程中往往涉及到強(qiáng)制類(lèi)型轉(zhuǎn)換;下面舉例直接將函數(shù)的地址賦值給函數(shù)指針;
現(xiàn)需要將printf函數(shù)的地址直接賦值給函數(shù)指針,使用函數(shù)指針代替printf
int (*p)(const char *, ...); //根據(jù)printf原型定義函數(shù)指針
p = printf; //賦值
p("hello world!\n"); //調(diào)用
假定printf的函數(shù)地址為0x8048320可以將該地址強(qiáng)制類(lèi)型轉(zhuǎn)換賦值給p
int (*p)(const char *, ...); //根據(jù)printf原型定義函數(shù)指針
p = (int (*)(const char *, ...)0x8048320; //強(qiáng)制類(lèi)型轉(zhuǎn)換并賦值
p("hello world!\n"); //調(diào)用