函数指针是个不太容易理解的概念,区别于指针函数。
1. 函数指针:本身是个指针,只不过指向某个函数的起始地址,而不像普通指针(例如 int* p)那样指向变量,它本身是指向函数的指针
实例:
// ① 声明一个函数指针pFunction,指向某一个(返回值为int型,参数为int和int型)的函数
int ( * pFunction )( int, int )
// ② 声明一个函数指针pFunction,指向某一个(返回值为void,参数也是void)的函数
void ( * pFunction )( void )
// ③ 声明一种指针类型pFunType,使用该类型定义的指针指向(返回值为int型,参数为int和int型)的函数
typedef int ( * pF )( int, int )
上述三例中,pFunction 和 pF 都作为函数指针的声明。其中① 和② 只是具体内容(函数的返回值、参数)不同,形式相同。③中使用typedef来声明一种函数指针的类型,关于typedef,一般使用都是 typedef name TYPENAME 的形式,用于函数指针时较为特殊,可以理解为:函数指针类型声明都是在表达式中的固定位置进行声明。即在 typedef int ( * pF )( int , int ) 中 pF 的位置是固定的,在该位置上的就是声明的部分。
一般常用③typedef的形式声明函数指针类型。
理解了typedef的含义,再来看整个表达式,既然是类型声明,因此有 pF pMove 的使用形式。声明了一个 pMove 指针,等同于 int ( *pMove )( int , int )
另外还有一种使用场景也比较常见,函数指针作为函数的返回值,形如int ( * (fun( char c ) ) )( int , int )或 pF function( char c )
分析一下这个声明,划线部分是一个函数fun( char ),拆开了看, int ( * ( ) )( int , int ) 和 fun( char c ) ,如上所述 int ( * ( ) )( int , int ) 等同于pF类型,可以看到这里是用pF 来修饰函数 fun( char c ),pF 是“指向返回值为 int 型,参数为 int 和 int 型的函数的指针”类型,所以 fun( char c ) 的返回值就是一个指针,该指针“指向返回值为 int 型,参数为 int 和 int 型的函数”,即为 pF function( char c )的形式。
2. 指针函数
实例: int * function( int a , int b )
指针函数就是返回值为指针的函数,比较常见不再多说,唯一的特殊情况就是,如果返回的指针是函数指针,则是函数指针作为函数的返回值的应用场景了。