函数指针的正向调用和回调函数

理解

函数指针:是一个指针,指向函数入口地址的指针。本质就是一个数据类型,可以来定义变量。

函数指针正向调用:在应用程序中直接给函数指针赋值,调用指针指向的函数,就是正向调用。
函数指针反向调用(回调函数):在应用程序中函数指针作为函数参数,在函数里面调用指针所指向的函数,就是回调函数。

回调函数意义

1、调用者不需要关心被调用者是如何实现的,只需要在特定的时机,选择传入某个函数地址;
2、被调用者不需要关心自己什么时候被调用,只需要实现自己的功能就好。

三个锦囊故事

        一天,刘备需要南下找孙权商量联合抗曹的事情,可是担心自己可能有去无回了,但是军师诸葛亮有必须在家里处理家务事。所以最近很是头疼。

        诸葛亮看在眼里,为了打消主公的担忧,在家里制作了三个锦囊,这三个锦囊可以帮助刘备化险为夷,但是必须在遇到困难时,按照顺序打开才行。

        诸葛亮就锦囊交给刘备,并且告诉了他在遇到一个困难时,按照顺序打开一个锦囊就可化险为夷。刘备于是就放心的南下了,最后成功的联合了孙权一起抵抗曹军。

        这个故事告诉我们:

1、诸葛亮不需要知道刘备什么时候会遇到困难,只需要知道他在有困难时怎么帮助他就好了(三个锦囊)

2、刘备并不知道锦囊里是什么,只需要自己在遇到困难时,打开锦囊就好了

3、三个锦囊就是实现功能的函数,而刘备就是通过打开锦囊这个函数回调锦囊里的功能函数的。

加减乘除例子

下面通过代码来演示函数指针的正向调用和逆向调用(回调函数)

正向调用代码(C语言)

#include <stdio.h>

/*定义一个函数指针的数据类型*/
typedef double (*Calc)(double num1,double num2); 

/*定义实现加减乘除运算的函数*/
double Add(double num1,double num2)
{
	return num1+num2;
} 
double Subtract (double num1,double num2)
{
	return num1-num2;
}
double Multiply (double num1,double num2)
{
	return num1*num2;
}
double Divide(double num1,double num2)
{
	return num1/num2;
}

int main(int argc, char *argv[])
{
	/*定义一个函数指针类型的变量*/
	Calc  ca;
	/*函数指针的正向调用*/
	double num1 = 3.3;
	double num2 = 1.1;
 	ca = Add;
 	printf("num1 + num2 = %lf\n",ca(num1,num2));
 	ca = Subtract;
 	printf("num1 - num2 = %lf\n",ca(num1,num2));
 	ca = Multiply;
 	printf("num1 * num2 = %lf\n",ca(num1,num2));
 	ca = Divide;
 	printf("num1 / num2 = %lf\n",ca(num1,num2));
 	
	return 0;
}

函数指针的逆向调用代码(回调函数)

#include <stdio.h>

/*定义一个函数指针的数据类型*/
typedef double (*Calc)(double num1,double num2); 

/*定义实现加减乘除运算的函数 
==> 可以封装到一个.c文件中 
==> 也可以封装成动态库DLL 供调用*/
double Add(double num1,double num2)
{
	return num1+num2;
} 
double Subtract (double num1,double num2)
{
	return num1-num2;
}
double Multiply (double num1,double num2)
{
	return num1*num2;
}
double Divide(double num1,double num2)
{
	return num1/num2;
}

/*将函数指针作为此函数参数,通过此函数来回调指针所指向的函数 
==> 可以是一个通用的接口供应用程序来调用 
==> 也可以是一个框架供应用程序来调用*/
void CommCalc(double num1,double num2,Calc func)
{
	printf("num1 calc num2 = %lf\n",func(num1,num2));		
}


int main(int argc, char *argv[])
{
	/*定义一个函数指针类型的变量*/
	Calc  ca;
	/*函数指针的正向调用*/
	double num1 = 3.3;
	double num2 = 1.1;

 	CommCalc(num1,num2,Add);
 	CommCalc(num1,num2,Subtract);
 	CommCalc(num1,num2,Multiply);
 	CommCalc(num1,num2,Divide);	
 	
	return 0;
}

    通过函数指针的正向调用逆向调用代码的比较,大家应该可以看出回调函数的意义了吧,我们可以把调用回调函数的函数写在一个框架中,当我们需要使用回调函数时,不需要动框架代码,只需要调用框架中的函数来完成就可以了。

沙米水平有限,希望大家多多指导,一起探讨,一起提高。

转载于:https://my.oschina.net/u/1783725/blog/679115

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值