Callback function
1> 函数指针
指向函数的指针变量简称为【函数指针】
1.1> 代码例程
#include "stdio.h"
int add(int a, int b);
int main(void)
{
int y = 0;
int (*fun)(int a, int b) = NULL;
fun = add;
y = add(1, 1);
printf("y : %d\n", y);
printf("add: 0x%X\n", add);
printf("add: 0x%p\n", &add);
printf("----------------------\n");
y = fun(1, 1);
printf("y : %d\n", y);
printf("fun: 0x%X\n", fun);
printf("fun: 0x%p\n", &fun);
}
int add(int a, int b)
{
return a+b;
}
1.2> 运行结果
y : 2
add: 0x401432
add: 0x00401432
----------------------
y : 2
fun: 0x401432
fun: 0x0060FEF8
1.3> 分析总结
2> 回调函数
2.1> 代码例程
#include "stdio.h"
int add(int a, int b);
int sub(int a, int b);
int op_func(int (*fun_p)(int a, int b), int a, int b);
int main(void)
{
int a = 2;
int b = 1;
int y = 0;
y = op_func(add, a, b);
printf("y = %d\n", y);
y = op_func(sub, a, b);
printf("y = %d\n", y);
return 0;
}
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int op_func(int (*fun_p)(int a, int b), int a, int b)
{
return fun_p(a, b);
}
2.2> 运行结果
y = 3
y = 1
2.3> 分析总结
main() — 调用 —>op_func( ) —通过func_p回调—> add() / sub();
add() / sub, 成为回调函数;
2.4> 回调函数优点1
1》将程序分为3层:
应用层 ----> main();
中间层-----> op_func();
底层--------> add() / sub;
分工明确,减少耦合;
3> 结构体实现回调函数
3.1> 代码例程
#include "stdio.h"
typedef struct {
int a;
int b;
int (*fun_p)(int a, int b); //函数指针
}op_t;
int add(int a, int b);
int sub(int a, int b);
int main(void)
{
op_t myop;
int y = 0;
myop.a = 2;
myop.b = 1;
myop.fun_p = add; // 函数指针赋值
y = myop.fun_p(myop.a, myop.b); // 调用回调函数
printf("y = %d\n", y);
myop.fun_p = sub;
y = myop.fun_p(myop.a, myop.b);
printf("y = %d\n", y);
return 0;
}
//----------- 回调函数 ---------//
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
3.2> 运行结果
y = 3
y = 1
3.3> 分析总结
回调函数过程:定义一个函数指针变量,给函数指针变量赋值,调用函数;
3.4> 回调函数优点2
结构体中只需要int (*fun_p)(int a, int b); //函数指针,减少内存开销;