引子:在學習CPrimerPlus的第十四章的14.13節中,遇到了如下三行文字,是有關指向函數的指針的,把我搞暈了。
char * fump(); //返回指向char的指針的函數 char (* frump)(); //指向返回類型為char的函數的指針 char (* flump[3])(); //由3個指針組成的數組,每個指針指向返回類型為char的函數
原來自己根本都不知道還有指向指針的函數,難怪自己懵逼了。參考了兩篇博客(1.“http://blog.csdn.net/hzyong_c/article/details/7464202” 2.“http://blog.chinaunix.net/uid-22145625-id-1789465.html”),自己作一個理解和記錄如下。
1.函數是可以被指針指向的
函數在編譯時會被分配一個入口地址,調用函數其實就是通過 指向函數入口地址的指針 進行的。
2.函數指針變量 的 聲明、定義與調用
聲明格式為:返回類型 (*函數指針變量) (參數列表)
例如: int (* FunPtr) (int, int) 。該例子中,FunPtr為函數指針,指向的函數是這樣的---輸入兩個int返回一個int。
定義格式為:返回類型 (*函數指針變量) (參數列表)
例如: FunPtr = ∑ //sum是一個相符的函數,即int sum(int, int);
調用格式為:(* 函數指針變量) (參數列表)
例如:b = (* FunPtr) (3, 5);
/* 為了體驗函數指針的聲明、定義和調用 */ #include <stdio.h> int sum(int, int); int main (void) { int a, b; int (* FunPtr) (int, int); //聲明 FunPtr 是指向函數的指針,指向的函數具有兩個int輸入和一個int輸出 FunPtr = & sum; //定義 FunPtr 指向的地址為函數 sum 的入口地址 a = sum(3,7); b = (* FunPtr) (3, 7); //調用函數指針 FunPtr printf("sum(3,7) = %d.\n(*FunPtr)(3,7) = %d\n", a, b); return 0; } int sum(int x, int y) { return (x+y); }