先來看一個程式:
/************************************************************* 函數指標與函數名**************************************************************/#include <iostream>using namespace std;int max(int, int);int main(){ cout<<max(1, 2)<<endl; cout<<(*max)(1, 2)<<endl; cout<<max<<endl; cout<<(*max)<<endl; cout<<&max<<endl; int (*p)(int, int); p = max; cout<<p(1, 2)<<endl; cout<<(*p)(1, 2)<<endl; cout<<p<<endl; cout<<(*p)<<endl; cout<<&p<<endl; int (*q)(int, int); q = &max; cout<<q(1, 2)<<endl; cout<<(*q)(1, 2)<<endl; cout<<q<<endl; cout<<(*q)<<endl; cout<<&q<<endl; return 0;}int max(int a, int b){ return a > b? a : b;}
運行結果:
220040120D0040120D0040120D220040120D0040120D0012FF7C220040120D0040120D0012FF78
引用文章《徹底搞定C指標-函數名不得已函數指標》的結論語:
1. 其實,max的函數名與函數指標p, q都是一樣的,即都是函數指標。max函數名是一個函數指標常量,而p, q是一個函數數指標變數,這是它們的關係。
2. 但函數名調用如果都得如(*max)(1, 2);這樣,那書寫與讀起來都是不方便和不習慣的。所以C語言的設計者們才會設計成又可允許max(1, 2);這種形式地調用(這樣方便多了並與數學中的函數形式一樣)。
3. 為統一起見,P, q函數指標變數也可以p(1, 2), q(1, 2)的形式來調用。
4. 賦值時,即可P = max形式,也可q = &max。