今天在学习linux下c程序设计时,看到函数指针时,在书上看到一个例子如下:
1 int get_max(int i, int j, int k, int (*pt)(int,int))
2 {
3 int ret;
4
5 ret = pt(i,j);
6 // ret = (*pt)(i,j);
7
8 return ret;
9 }
没接触过,函数指针可以这样用,第一感觉应该是第六行所示的使用方式;怀疑是其书写错误,后来在实际在电脑上测试了下,结果是正确的,这两种方式都能成功运行。。。。。
又去翻了K&R求证一下,并没提到用函数指针名直接调用函数这种方式。自己也开始纠结了,自己接着又对程序调试了一番,看下pt与*pt的值是否一样,如期待的那样是一样的,不一样程序肯定不能正确运行,看来是编译器在编译的时候对函数指针变量pt与*pt是做相同值处理,pt就等于*pt;
最后在网上看到一篇好文,详细的讲述了函数名与函数指针的关系。
原文:《彻底搞定C指针-函数名与函数指针》
void MyFun(int x); //这个申明也可写成:void MyFun( int );
void (*FunP)(int ); //也可申明成void(*FunP)(int x),但习惯上一般不这样。
结论:
1. 其实,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。