我所理解的回调函数

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;	
}

 

-----------------------------------------------------------------------------------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值