最近经常看到“回调函数”这个概念,但不是很理解。为了弄明白回调函数,提出了以下三个问题:
1.什么是回调函数
回调函数就是一个通过指针调用的函数,如果你把函数指针作为参数传给另一个函数,当这个指针被用来调用所指向的函数时,我们就说这是回调函数。
通俗理解:回调函数和普通函数没有任何区别,只是函数调用时略有区别。一般调用普通函数时,直接写函数名即可;但是在调用回调函数时,是把它作为参数传递给另一个函数。
引用网上用生活场景解释回调函数的一个例子:
比如你显示器不亮了,你不知道怎么弄,那你就问在外地干IT的大表哥,你大表哥告诉你该怎么弄,然后需要你自己来操作。你大表哥知道怎么弄,但却不能自己操作,而是由你来操作。你大表哥告诉你修机器的方法就是回调函数。
2.为什么要用回调函数
回调函数可以把调用者与被调用者分开,调用者不关心谁是被调用者,只需要知道存在一个具有特定原型和限制条件的被调用函数。
从本质上讲,回调函数都是从“你想让别人执行你的代码,而你又不能动别人的代码”这种需求下产生的。因此,只能讲自己实现的函数作为参数传递给别人的函数,这样别人的函数在特定的时候会执行自己的函数。
在面向对象的编程中,回调函数可以让模块间解耦。比如,在一个下载系统中有一个文件下载模块和一个下载文件当前进度显示模块,系统要求实时的显示文件的下载进度。但显示模块不知道也不应该知道下载模块所下载文件的下载进度(面向对象设计的封装性,模块间要解耦,模块内要内聚),文件下载进度是只有下载模块才知道的事情,此时的解决办法是,给下载模块传递一个函数指针作为回调函数驱动显示模块的显示进度。
3.如何使用回调函数
根据以上的理解,自己写了一个简单的回调函数:
#include <stdio.h>
void printEat(int n){
printf("吃吃吃--%d\\n",n);
}
void printBuy(int n){
printf("买买买--%d\\n",n);
}
void callback(int times,void(* print )(int)){
int i;
for(i = 0; i < times; i++){
print(i);
}
}
int main(){
callback(5,printEat);
callback(10,printBuy);
printf("你只知道吃吃吃买买买:]\\n");
return 0;
}