每個函數都佔用一段內存單元,它們有一個起始地址,指向函數入口地址的指針稱爲函數指針。ios
注意:函數指針的本質是一個指針變量,且指針指向的函數的入口地址。函數
返回類型 (*函數名) (參數表);spa
例:指針
#include <iostream> using namespace std; //定義一個函數指針pFUN,它指向一個返回類型爲char,有一個整型的參數的函數 char (*pFun)(int); //定義一個返回類型爲char,參數爲int的函數 //從指針層面上理解該函數,即函數的函數名其實是一個指針, //該指針指向函數在內存中的首地址 char glFun(int a) { cout << a; //return a; } int main() { //將函數glFun的地址賦值給變量pFun pFun = glFun; //*pFun」顯然是取pFun所指向地址的內容, 固然也就是取出了函數glFun()的內容,而後給定參數爲2。 (*pFun)(2); //pfun(2); 也是對的 return 0; }
typedef 返回類型 (*函數名) (參數表);code
例:內存
#include <iostream> using namespace std; //定義一個函數指針類型 typedef char (*mypFun)(int); //定義一個返回類型爲char,參數爲int的函數 //從指針層面上理解該函數,即函數的函數名其實是一個指針, //該指針指向函數在內存中的首地址 char glFun(int a) { cout << a; //return a; } int main() { //定義一個函數指針變量,將函數glFun的地址賦值給變量myp mypFun myp = glFun; //*pFun」顯然是取pFun所指向地址的內容, //固然也就是取出了函數glFun()的內容,而後給定參數爲2。 (*myp)(2); //myp(2); 也是對的 return 0; }
(*myp)(2); //下文用 星myp表示 myp(2); //兩種寫法都是對的
真是很是棒的語法! 爲什麼 myp 和 ( 星 myp)等價呢?一種學派認爲,因爲 myp 是函數指針,而 ( 星 myp)是函數,所以應將 ( 星 myp)() 用做函數調用。另外一種學派認爲,因爲函數名是指向該函數的指針,指向函數的指針的行爲應與函數名類似,所以應將 myp() 用做函數調用使用。C++ 進行了折衷——這 2種方式都是正確的,或者至少是容許的,雖然它們在邏輯上是互相沖突的。在認爲這種折衷粗糙以前,應該想到,容忍邏輯上沒法自圓其說的觀點正是人類思惟活動的特色。io