C 函数指针
August 17, 2017
C语言有了函数指针以后,就算是完整了,构建了这个世界。
先来看三个例子:
A) char * (*fun1)(char * p1,char * p2);
B) char * *fun2(char * p1,char * p2);
C) char * fun3(char * p1,char * p2);
最后一个很好理解,fun3是函数名,函数返回一个char*
。
中间个是返回一个二级指针,本质与最后一个没有什么区别。
在第一个中,其实就是函数指针了,fun1是个函数指针,这个函数返回一个char*
。
函数指针其归根结底是一个指针,所以他是可以赋值的。如下的一个函数指针:
int (*p)(int a, int b) = NULL;//初始化为 NULL
如果我们要给 p 赋值的话,我们就应该定义一个返回值类型为 int ,两个参数为 int 的函数:
int add(int a, int b)
{
return a + b;
}
p = add;//给函数指针赋值
经过上面的赋值,我们就可以使用 p 来代表函数:
p(5, 6);//等价于 add(5, 6);
printf("%d\n", p(5, b));
当然这并不是主要的用法,最主要的用法是用作回调函数。
函数回调 #
函数回调的本质就是让函数指针作为函数参数,函数调用时传入函数地址,也就是函数名即可。 所谓回调函数就是在做完某些事情以后做的一件事情,函数回调一般使用在需要等待或者耗时操作,或者得在一定时间或者事件触发后回调执行的情况下。
想比较其他的方式,回调函数更加灵活。回调函数是由你来实现,交给对方来执行。你传递给对方你一个函数指针。
example #
//定义回调函数
void PrintfText()
{
printf("Hello World!\n");
}
//定义实现回调函数的"调用函数"
void CallPrintfText(void (*callfuct)())
{
callfuct();
}
//实现函数回调
int main(int argc,char* argv[])
{
CallPrintfText(PrintfText);
return 0;
}
函数名本身就是一个函数指针,所以直接传函数名就可以实现。在函数声明的地方要使用函数指针的方式去声明参数。