C 函数指针

C语言有了函数指针以后,就算是完整了,构建了这个世界。

先来看三个例子:

1
2
3
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*

函数指针其归根结底是一个指针,所以他是可以赋值的。如下的一个函数指针:

1
int (*p)(int a, int b) = NULL;//初始化为 NULL

如果我们要给 p 赋值的话,我们就应该定义一个返回值类型为 int ,两个参数为 int 的函数:

1
2
3
4
5
int add(int a, int b)
{
return a + b;
}
p = add;//给函数指针赋值

经过上面的赋值,我们就可以使用 p 来代表函数:

1
2
p(5, 6);//等价于 add(5, 6);
printf("%d\n", p(5, b));

当然这并不是主要的用法,最主要的用法是用作回调函数。

函数回调

函数回调的本质就是让函数指针作为函数参数,函数调用时传入函数地址,也就是函数名即可。
所谓回调函数就是在做完某些事情以后做的一件事情,函数回调一般使用在需要等待或者耗时操作,或者得在一定时间或者事件触发后回调执行的情况下。

想比较其他的方式,回调函数更加灵活。回调函数是由你来实现,交给对方来执行。你传递给对方你一个函数指针。

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//定义回调函数
void PrintfText()
{
printf("Hello World!\n");
}

//定义实现回调函数的"调用函数"
void CallPrintfText(void (*callfuct)())
{
callfuct();
}

//实现函数回调
int main(int argc,char* argv[])
{
CallPrintfText(PrintfText);
return 0;
}

函数名本身就是一个函数指针,所以直接传函数名就可以实现。在函数声明的地方要使用函数指针的方式去声明参数。

Talk is not cheap.