函数名与函数指针
先来看一个程序:
/************************************************************* 函数指针与函数名 **************************************************************/ #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; }
运行结果:
2 2 0040120D 0040120D 0040120D 2 2 0040120D 0040120D 0012FF7C 2 2 0040120D 0040120D 0012FF78
引用文章《彻底搞定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。
2. 但函数名调用如果都得如(*max)(1, 2);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许max(1, 2);这种形式地调用(这样方便多了并与数学中的函数形式一样)。
3. 为统一起见,P, q函数指针变量也可以p(1, 2), q(1, 2)的形式来调用。
4. 赋值时,即可P = max形式,也可q = &max。