在语法结构上,函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,函数指针可以用来指向一个函数。
举例说明:
指针函数大多这样定义int *fun(int x,int y);他返回的是一个指向整型数据的地址指针,其值是指针;
函数指针大多这样定义int (*fun)(int x, int y);他一般表示为指向数组的首地址,或者是指向函数代码的首地址,指向函数代码首地址的指针变量。
注意:()的优先级要比*高。
比如有一个分割字符串的函数strtok_s,函数原型如下:
- char *strtok_s( char *strToken, const char *strDelimit, char **context );
他的返回值就是一个指向分割后的字符串char*的地址。
而在STL中,有一个算法sort,函数原型如下:
- template inline
- void sort(_RanIt _First, _RanIt _Last);
- template inline
- void sort(_RanIt _First, _RanIt _Last, _Pr _Pred);
其中的_Pr _Pred就是一个_Pr类型的类对象或是函数指针。
其实,函数指针就相当于C#中委托的概念,但却有本质上的区别,这里不做详细讨论。
函数指针最大的优点是调用中具有相同的入口,可以有不同的实现。比如说上面的sort算法,在传入不同的函数体_Pred的时候,你可以传入升序的方法,也可以传入降序的方法,但只需编写一个函数sort就可以实现两个功能(甚至多个,和你的传入_Pred有关,比如你可以让一个整数向量中偶数升序,奇数降序排序)。好处显而易见,STL中的很多算法都是如此实现。
我们也可以如此使用,下面举例:
- #include <iostream>
- using namespace std;
- typedef void (*Fun)(int, int );
- class A
- {
- public:
- void PointFun( int a, Fun pFun );
- static void myFun(int a, int b);
- };
- class B
- {
- public:
- static void MyFunB(int a, int b);
- void CallAFun();
- };
- void A::PointFun( int a, Fun pFun )
- {
- int m = a;
- int n = 2;
- pFun(m, n);
- }
- void A::myFun(int a, int b)
- {
- cout<<a<<" "<<b<<endl;
- }
- void B::MyFunB( int a, int b )
- {
- cout<<a<<" "<<b<<endl;
- }
- void B::CallAFun()
- {
- A pA;
- pA.PointFun(8 , &B::MyFunB);
- }
- int main(void)
- {
- A pA;
- pA.PointFun(3, &A::myFun);
- B pB;
- pB.CallAFun();
- system("pause");
- return 0;
- }
应当注意的是,如果想在类中实现,函数体要么设为全局函数,要么设为静态函数。因为,函数指针指向的是一块代码区,地址是不属于任何一个对象的。
上面的代码中,A::myFun和B::MyFunB都是不同的类中的函数实现,一个入口,多种实现!