谈到这个话题,初学者可能在这方面较难看懂。不过对c/c++较熟悉的人来说,大家谈到指向函数的指针就会想到在排序中,那个以函数作为参数传递到排序函数中就是一个最典型的应用。
1.指向函数的指针的类型
指向函数的指针应该怎样声明?拿两个字符串的比较函数来说:
int strCompare(const string & s1, const string & s2) ;
如果两个字符串相等就返回0,否则,s1< s2返回负数,s1 > s2返回正数其实函数名不是其类型的一部分,函数类型是只由它的返回类型和参数来决定。函数名称只不过是指向函数代码的地址。所以指向函数的指针的类型应该用下面的形式声名:
int (*pf)( const string &, const string & );
2.初始化和赋值
指向函数的指针可如下被初始化只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型
完全匹配时初始化和赋值才是正确的如果不匹配则将产生编译错误消息在指向函数
类型的指针之间不存在隐式类型转换。


指向函数的指针可以如下被赋值
pfi = strCompare;
pfi2 = pfi;
3.调用
如下代码:




























4.函数指针的数组
我们可以声明一个函数指针的数组例如
int (*testCases[10])();
将testCases 声明为一个拥有10 个元素的数组每个元素都是一个指向函数的函数指针,该函数没有参数返回类型为int。
上面的声明等价于下面声明:


函数指针的数组可以用一个初始化列表来初始化该表中每个初始值都代表了一个与数
组元素类型相同的函数例如












5,参数和返回类型
函数参数的类型不能是函数类型函数类型的参数将被自动转换成该函数类型的指针
例如



编译器把sort()当作已经声明为
void sort( string *, string *,
int (*)( const string &, const string & ) );
上面这两个sort()的声明是等价的
注意除了用作参数类型之外函数指针也可以被用作函数返回值的类型例如
int (*ff( int ))( int*, int );
该声明将ff()声明为一个函数它有一个int 型的参数返回一个指向函数的指针类型
为
int (*) ( int*, int );
同样使用typedef 名字可以使声明更容易读懂例如下面的typedef PF 使得我们能更
容易地分解出ff()的返回类型是函数指针
typedef int (*PF)( int*, int );
PF ff( int );
函数不能声明返回一个函数类型如果是则产生编译错误例如函数ff()不能如下
声明
// typedef 表示一个函数类型
typedef int func( int*, int );
func ff( int ); // 错误: ff()的返同类型为函数类型