关于函数指针和指针函数的讨论已经是老话题了,但由于平时使用的频率不是特别的高,又很容易忘记其概念,今天又用到了函数指针,正好在这里记录总结一下。
顾名思义,函数指针这个词组中心词是指针这个名词,所以它是一个指针变量,一个指向某个特定类型函数的指针。它也可以声明为类型。使用举例:
int (*func)(int val); //这句表达式声明了一个指针变量,他有一个int参数,并返回一个int值。
typedef int (*func)(int val); //为函数指针声明类型定义。
void call(func fp, void* ctx); // 声明一个函数,参数1为函数指针。
int fCallback(int val)
{
...
}
void main(void)
{
call(fCallback, NULL);
}
函数指针的使用场合最多的还是回调,要想写出高质量且封装性较好的代码,回调的使用很常见。由系统提供封装,调用用户编写的回调函数来处理事务,已到达用户的特定需求。回调函数的使用使得封装更容易,也更利于用户的移植和维护,也减少了系统代码的重复量,是其更简洁。由系统提供接口,将实现留给用户实现,这是使用回调的精髓所在。
指针函数其中心词是函数,所以它是一个函数,一个返回值为指针的函数。指针函数没有什么特殊的用法,跟普通函数没太大区别,不再详述、使用举例:
int *func(int val); //声明一个函数,它有一个int参数,并返回一个int型的指针。
两者的定义其实很容易弄明白,而他们的表达式形式其实也比较容易区分,根据编译器结合原则,总是先与括号结合,所以根据这点就不难判断func的类型,是个指针还是个函数名。