在程序運(yùn)行中,函數(shù)代碼是程序的算法指令部分,它們和數(shù)組一樣也占用存儲空間,都有相應(yīng)的地址。可以使用指針變量指向數(shù)組的首地址,也可以使用指針變量指向函數(shù)代碼的首地址,指向函數(shù)代碼首地址的指針變量稱為函數(shù)指針。
1.函數(shù)指針定義
函數(shù)類型 (*指針變量名)(形參列表);
“函數(shù)類型”說明函數(shù)的返回類型,由于“()”的優(yōu)先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定義函數(shù)指針時請注意:
函數(shù)指針和它指向的函數(shù)的參數(shù)個數(shù)和類型都應(yīng)該是—致的;
函數(shù)指針的類型和函數(shù)的返回值類型也必須是一致的。
2.函數(shù)指針的賦值
函數(shù)名和數(shù)組名一樣代表了函數(shù)代碼的首地址,因此在賦值時,直接將函數(shù)指針指向函數(shù)名就行了。
例如,
int func(int x); /* 聲明一個函數(shù) */
int (*f) (int x); /* 聲明一個函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
賦值時函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。
3.通過函數(shù)指針調(diào)用函數(shù)
函數(shù)指針是通過函數(shù)名及有關(guān)參數(shù)進(jìn)行調(diào)用的。
與其他指針變量相類似,如果指針變量pi是指向某整型變量i的指針,則*p等于它所指的變量i;如果pf是指向某浮點(diǎn)型變量f的指針,則*pf就等價于它所指的變量f。同樣地,*f是指向函數(shù)func(x)的指針,則*f就代表它所指向的函數(shù)func。所以在執(zhí)行了f=func;之后,(*f)和func代表同一函數(shù)。
由于函數(shù)指針指向存儲區(qū)中的某個函數(shù),因此可以通過函數(shù)指針調(diào)用相應(yīng)的函數(shù)。現(xiàn)在我們就討論如何用函數(shù)指針調(diào)用函數(shù),它應(yīng)執(zhí)行下面三步:
首先,要說明函數(shù)指針變量。
例如:int (*f)(int x);
其次,要對函數(shù)指針變量賦值。
例如: f=func; (func(x)必須先要有定義)
最后,要用 (*指針變量)(參數(shù)表);調(diào)用函數(shù)。
例如: (*f)(x);(x必須先賦值)