很早的时候课上见过函数指针,后来就再也没有遇到过。以后我会留心标准C++里是否还用这个东西。函数指针说起来是个指针变量,指向一个函数的入口地址。函数的入口地址是什么,暂且不去细究,总之和普通变量地址,结构体地址,类地址一样,有了这个地址,就有了这个地址指向的实体。
关于函数指针的几点常识:
1.函数指针的声明
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,如果不加括号,代码就成了声明一个返回类型为指针类型的函数(指针函数),后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
2.函数指针的赋值
函数名和数组名一样代表了函数代码的首地址,函数名和数组名都是地址常量(不可修改,不可赋值,只能做右值),因此在赋值时,直接将函数指针指向函数名就行了。
注意:赋值时要求函数指针和他指向函数的格式一致才可以赋值,即函数返回类型一致,参数列表一致。否则无法赋值。
另外,赋值语句的语法格式,和函数调用格式有点奇怪,如下面的代码:
1 int print(int x) 2 { 3 cout<<x<<endl; 4 return 0; 5 } 6 7 int _tmain(int argc, _TCHAR* argv[]) 8 { 9 int a=10; 10 11 int (* p)(int); //声明两个函数指针 12 int (*p2)(int); 13 14 p=print; //用两种形式赋值,貌似第二种不合法,但经验证却是成功的 15 p2=(*p); //经验证这种方式是成功的,但是(*p2)=p是错的 16 17 (*p)(a); //用两种形式调用函数,貌似第二种不合法,但经验证却是成功的 18 p(a); 19 20 (*p2)(a); 21 p2(a); 22 23 getchar(); 24 return 0; 25 }
也就是说,p的值竟然和(*P)的值是一样的。有人认为,C语言中,本着指针的使用原理,函数指针使用时加*(dereference operator);C++中为跟函数对象统一,所以不加*。因此,语法上函数指针使用时加不加*都一样。