2015年上班第一天,也是第一次写博客。技术很菜,只是记录每天的学习,希望自己一天天长大。
之前一直看到有回调函数,可是一直没有弄清楚,不知道为什么会有回调函数,和一般的函数调用有什么区别呢?
带着这样的问题,今天深究一下。PS:百度了好多,博客,评论之类的。。。
------------------------------------------------------------------------------------
1、为什么会有回调函数?(也就是说它的使用情景之类的)
2、和其它普通的函数调用什么区别?优缺点?
------------------------------------------------------------------------------------
首先,说一下回调函数的定义。
回调函数:就是函数指针的一种使用。回调函数是由用户撰写,而由操作系统调用的一类函数,如果你把A函数的指针(地址)作为参数传递给另一个B函数,当这个指针被用为调用它所指向的A函数时,我们就说这是回调函数。
PS:此时,A函数相当于callback回调函数,A函数就是被调用的函数。A函数可以任意定义功能,也就是说A函数可以有很多,比如A1,A2,A3。。。只要把A1,A2,A3。。。的函数地址(也就是函数名称)作为B函数的参数,使用的时候就可以直接调用B函数,利用传入的参数,就可以调用A1,A2,A3的函数。
这里注意:真正被调用函数为回调函数,回调函数由用户撰写,也就是为A函数。B函数为系统函数,负责向外提供接口。
那么,为什么会有回调函数呢?
回调函数就是为了提供一个接口,当用户有不同的需求,把需求写下来,塞到这个接口,然后调用就行了。
********************************************************************************************************************************************
为什么要使用回调函数呢?
因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
-----某博主
*********************************************************************************************************************************************
2、第二个问题,其实和第一个差不多,普通的函数调用,只是简单的调用一个函数而已,而回调函数,可以将一类函数用一个回调函数来实现,对于用户,你只要去写你的功能就行。
下面我就写一个例子更容易说清问题。
-----------------------------------------------------------------------------------------------------------------------------------------------------
<pre name="code" class="cpp">#include <stdio.h>
typedef void (* callbackfun)(int)
void Fun1(int n)
{
printf("我是用户1,我想要面包,%d",n);
}
void Fun2(int n)
{
printf("我是用户2,我想要牛奶,%d",n);
}
//这个是系统封装起的功能,只要用户知道利用这个功能实现自己的所需要的功能即可。
void callback(int times, callbackfun pfun)
{
int i = 0;
for(i;i< times;i++)
{
pfun(i);
}
}
int main(void)
{
callback(3,Fun1);
callback(4,Fun2);
Fun1(3);
Fun2(4);
return 0;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------