函数指针:是一个指针,指向函数入口地址的指针。本质就是一个数据类型,能够来定义变量。框架
函数指针正向调用:在应用程序中直接给函数指针赋值,调用指针指向的函数,就是正向调用。
函数指针反向调用(回调函数):在应用程序中函数指针做为函数参数,在函数里面调用指针所指向的函数,就是回调函数。ide
一、调用者不须要关心被调用者是如何实现的,只须要在特定的时机,选择传入某个函数地址;
二、被调用者不须要关心本身何时被调用,只须要实现本身的功能就好。函数
一天,刘备须要南下找孙权商量联合抗曹的事情,但是担忧本身可能有去无回了,可是军师诸葛亮有必须在家里处理家务事。因此最近非常头疼。spa
诸葛亮看在眼里,为了打消主公的担心,在家里制做了三个锦囊,这三个锦囊能够帮助刘备化险为夷,可是必须在遇到困难时,按照顺序打开才行。指针
诸葛亮就锦囊交给刘备,而且告诉了他在遇到一个困难时,按照顺序打开一个锦囊就可化险为夷。刘备因而就放心的南下了,最后成功的联合了孙权一块儿抵抗曹军。code
这个故事告诉咱们:接口
一、诸葛亮不须要知道刘备何时会遇到困难,只须要知道他在有困难时怎么帮助他就行了(三个锦囊)ip
二、刘备并不知道锦囊里是什么,只须要本身在遇到困难时,打开锦囊就行了回调函数
三、三个锦囊就是实现功能的函数,而刘备就是经过打开锦囊这个函数来回调锦囊里的功能函数的。io
下面经过代码来演示函数指针的正向调用和逆向调用(回调函数)
正向调用代码(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; }
经过函数指针的正向调用逆向调用代码的比较,你们应该能够看出回调函数的意义了吧,咱们能够把调用回调函数的函数写在一个框架中,当咱们须要使用回调函数时,不须要动框架代码,只须要调用框架中的函数来完成就能够了。
沙米水平有限,但愿你们多多指导,一块儿探讨,一块儿提升。