一、什么是回调函数
打个比方:
1、一个农场主(主调函数)要做一件事,分为3步骤:生产原材料(蔬菜、水果、家禽)、将原材料加工成成品(美味佳肴)、消费这些成品(美味佳肴);
2、农场附近有各种各样的加工店铺(被调函数):FuncVegetable(炒菜的)、FuncFruit(做水果沙拉的)、FuncMeat(加工肉类熟食的)
3、各个加工店铺给农场主一个名片(即各个加工店铺的地址),农场主根据名片(地址)找到各个加工店铺,把这些原材料给加工店铺,加工店铺按照自己的功能对原材料进行加工,(再将加工好的成品返回给农场主的过程)这就是回调
PS:
1)农场主:主调函数
2)各店铺:被调函数
3)原材料:传递给被调函数的形参
4)名片:被调函数的地址
5)回调函数注册过程如下:
农场主在农场设了个广告牌,分两列:原材料列(形参)、店铺地址列(名片--即被调函数名)
————————————————————————————————————————————
吃的 | 西红柿 | 吃的 | 鸡蛋 || 炒菜店铺地址(FuncVegetable)
-------------------------------------------------------------------------------------------------------------------
吃的 | 苹果 | 吃的 | 凤梨 || 做水果沙拉店地址(FuncFruit)
-------------------------------------------------------------------------------------------------------------------
吃的 | 牛肉 | 吃的 | 羊肉 || 肉类加工店地址(FuncMeat)
————————————————————————————————————————————
农场主根据广告牌上各个店铺的地址(被调函数的函数名),传递原材料(形参)给对应店铺---------------这就是回调函数的注册
6)回到函数的执行:
农场主(主调函数)把原材料(形参)传给各个店铺(被调函数),各个店铺(被调函数)根据自己的功能对原材料进行加工(加工好的成品可以可以返回给农场主,也可以不返回----自己享用了,~~哈哈~~)
小结:
农场主根据名片将各种原材料交个各个店铺,各个店铺根据各自功能对原材料进行加工(加工好的成品可以返回给农场主,也可以不返回)
对比:
主调函数根据地址(被调函数的函数名)将形参传递给各被调函数,各被调函数根据各自功能对形参进行处理
这句是 所谓的回调
二、示例
1)农场主:对应main函数
2)各店铺:依次对应FuncVegetable、FuncFruit、FuncMeat
3)吃的:变量类型
4)原材料:形参
#include
#include
/*设置一个广告牌------即定义一个函数指针*/
typedef (*cook_callbackfunc) (int a , int b);
int cook_register(int a, int b, cook_callbackfunc cook_func)
{
cook_func(a,b);
}
int FuncFruit(int a, int b)
{
printf("FuncFruit:a=%d,b=%d\n",a,b);
return (a+b);
}
int FuncMeat(int a, int b)
{
printf("FuncMeat:a=%d,b=%d\n",a,b);
return (a+b);
}
int FuncVegetable(int a, int b)
{
printf("FuncVegetable:a=%d,b=%d\n",a,b);
return(a+b);
}
int main()
{
/*1、农场主准备生产原材料---main定义变量*/
int vegetable_a = 10 , vegetable_b = 20;
int fruit_a = 12, fruit_b = 18;
int meat_a = 19, meat_b = 21;
int ret_vegetable = 0,ret_friut = 0, ret_meat = 0;
/*2、农场主将原材料和各个店铺的地址对应起来----注册回调函数*/
ret_vegetable =cook_register(vegetable_a ,vegetable_b,FuncVegetable);/*农场主将原材料(即形参)与店铺地址(即被调函数的函数名)一一对应起来*/
ret_friut = cook_register(fruit_a ,fruit_b,FuncFruit);
ret_meat = cook_register(meat_a ,meat_b ,FuncMeat);
/*3、农场主享用成品---main函数处理被调函数返回的结果*/
printf("main:(ret_vegetable +ret_friut +ret_meat )=%d\n",(ret_vegetable +ret_friut +ret_meat ));
return 0;
}
执行结果:
$ ./a.out
FuncVegetable:a=10,b=20
FuncFruit:a=12,b=18
FuncMeat:a=19,b=21
main:(ret_vegetable +ret_friut +ret_meat )=100
阅读(943) | 评论(0) | 转发(0) |