第一个问题:什么是回调函数?来看一下百度百科的定义为:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。说的很复杂,我们来用一个生活中的例子来理解回调的意义。在看这个例子之前我们来总结一下回调机制原理。
回调函数是利用函数指针来实现的一种调用机制
回调机制原理:
1.调用者不知道具体事件发生时需要调用的具体函数
2.被调函数不知道何时被调用,只知道需要完成的任务
3.当具体事件发生时,调用者通过函数指针来调用具体函数
回调机制中的调用者和被调函数互不依赖。
例子:我们经常在电视剧或者电影中看到如下情节,一位主人公为了完成某个非常难的任务,这个时候一个绝世高人给了他一个锦囊,对他说你在遇到困难的时候打开这个锦囊,这个锦囊里面写的东西会告诉你怎么做。其实这里面就蕴含了回调的机制在里面。为什么呢?就比如我们把主人公去某个地方完成任务比作一个函数(调用者),然后锦囊里面的内容为一个函数(被调用者)。看看满不满足上述的3个条件。1.主人公不知道锦囊里面的内容,2.锦囊不知道什么时候会被主人公拆开,锦囊里面只写着怎么帮助主人公解决困难。3.当主人公遇到困难的时候,主人公通过打开锦囊来解决困难。
来看一个C语言程序加深大家对回调函数的理解。
#include <stdio.h>
typedef int(*Weapon)(int);
void fight(Weapon wp,int arg)
{
printf("Fight Boss!\n");
int result=0;
result=wp(arg);
printf("Boss Loss=%d\n",result);
}
int knife(int n)
{
int ret=0;
int i=0;
for(i=0;i<n;i++)
{
printf("knife attack:%d\n",1);
ret+=1;
}
return ret;
}
int sword(int n)
{
int ret=0;
int i=0;
for(i=0;i<n;i++)
{
printf("Sword attack:%d\n",5);
ret+=5;
}
return ret;
}
int gun(int n)
{
int ret=0;
int i=0;
for(i=0;i<n;i++)
{
printf("Gun attack:%d\n",10);
ret+=10;
}
return ret;
}
int main()
{
fight(knife,5);
fight(sword,5);
fight(gun,5);
return 0;
}
怎样理解这个例子呢?
1.fight(wp,arg)函数和knife(n),sword(n),gun(n)他们之间互不依赖,只有当在主函数mian()中调用这3句代码的时候fght(knife,5);fight(sword,5);fight(gun,5);他们之间才通过函数指针产生联系。
本文借鉴了狄泰软件学院的思想在里面。
来源:https://blog.csdn.net/weixin_42136255/article/details/100668311