文章目录
1.C语言中回调函数的概念
1.1回调函数
在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过参数将函数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。以sort()排序函数为例。
要实现回调函数,最关键的一点是要将函数的指针传递给一个函数(上图中是库函数),然后这个函数就可以通过这个指针来调用回调函数了。
1.2 函数指针
函数指针也是一种指针,它指向的是函数。在C中,每个函数在编译后都是存储在内存中,并且每个函数都要一个入口地址,根据这个地址,我们就可以访问并使用这个函数。函数指针就是通过指向这个函数的入口,从而调用这个函数。
1.2.1 函数指针的使用
- 函数指针的定义
//method 1
void (*p_func)(int , int ,float) = NULL;
//method 2
typedef void(*tp_func)(int,int,float);
tp_func p_func = NULL;
这两种方式都是定义了一个指向返回值为void类型,参数为(int,int,float)的函数指针。
- 函数指针的赋值
void (*p_func)(int,int,float) = NULL;
p_func=&func1;
p_func=func2; //编译器会隐式地将func_2由void()(int,int,float)类型转换成
//void(*)(int,int,float)
- 使用函数指针调用函数
因为函数指针也是指针,因此可以使用常规的带*的方法来调用函数,和函数指针的赋值一样,我们也可以使用两种方法:
int val1 = p_func(1,2,3.0);
int val1 = (*p_func)(1,2,3.0);
- 将函数指针作为参数传给函数
函数指针和普通指针一样,我们可以将它作为函数的参数传递给函数,下面我们看看如何实现:
//func_3 将函数指针p_func 作为其形参
void func_3(int a,int b,float c,void(*p_func)(int ,int,float ))
{
(*p_func)(a,b,c);
}
//func_4 调用func_3
void func_4()
{
func_3(1,2,3.0,func_1);
//or func_3(1,2,3.0,&func_1);
}
- 函数指针作为函数返回类型
返回类型为函数指针的函数:
void (* func_5(int,int,float))(int,int)
{
...
}
func_5 以(int,int,float)为参数,其返回类型为void(*)(int,int)。
- 函数指针数组
void (*func_array_1[5])(int,int,float);
typedef void (*P_func_array)(int,int,float);
P_func_array func_array[5];
2.函数指针及回调函数示例
#include <stdio.h>
#i