在网上看了许多关于回调函数的解释,感受没能get到主要的一个点,就本身写一下对回调函数的理解及回调函数的应用场景和做用吧函数
一、官方定义spa
回调函数就是一个经过函数指针调用的函数。若是你把函数的指针(地址)做为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,咱们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。设计
二、函数指针指针
理解回调函数前必须知道什么是函数指针code
函数指针也是一种指针,只是它指向的不是整型,字符型而是函数。在C中,每一个函数在编译后都是存储在内存中,而且每一个函数都有一个入口地址,根据这个地址,咱们即可以访问并使用这个函数。函数指针就是经过指向这个函数的入口,从而调用这个函数。blog
int fun();
int (*p)();
fun是一个返回值为整型的函数
p是一个指针,指针指向一个函数,函数的返回值是整型
p = fun; 函数fun把地址赋给函数指针p
下次调用fun()能够直接用 (*p)( ) 或者 p( ) 事件
为何能够直接用p(),由于函数名本质也是一个地址,函数指针本质也是一个地址,把地址fun赋给地址p ,p不就等于fun了吗,(*p)和p至关于间接访问和直接访问的关系,不用纠结过多内存
三、回调函数get
回调函数就是你写一个函数,把函数地址赋值一个函数指针,而后把这个函数指针看成参数赋给另外一个函数,另外一个函数经过函数指针的地址调用这个函数,就是回调函数,他有什么做用呢,举个例子
好比,咱们写A B C D 四个函数,封装成一个库文件,而后咱们的主函数里面要写一个功能函数,这个功能要用到函数A,假如不用函数指针,这个功能函数就要调用函数A,下次若是用到函数B,那么咱们得删掉A,调用函数B,每次都要修改这个函数很麻烦,但若是使用回调函数就不同了,咱们能够定义4个函数指针,把4个函数的地址分别赋给4个函数指针,而后将函数指针看成参数传递给功能函数,功能函数就能够经过修改参数来调用对应的函数,而它自己不用作任何的修改。这样的话,功能函数就能够根据不一样的状况,经过函数指针去调用不一样的函数,代码以下回调函数
#include <stdio.h> #include <stdlib.h> float ADD(float a, float b) { return a + b; } float SUB(float a, float b) { return a - b; } float MUL(float a, float b) { return a * b; } float DIV(float a, float b) { return a / b; } float (*A)(float x, float y) = ADD; float (*B)(float x, float y) = SUB; float (*C)(float x, float y) = MUL; float (*D)(float x, float y) = DIV; float fun(float x, float y, float(*p)(float x, float y)) { return p(x, y); } int main() { printf("%f", fun(2, 3, A)); }
再举一个例子,咱们要实现一个函数,函数的功能是查找链表里面的某一个值,那么函数设计两个参数,一个是链表第一个结点的指针,还有一个要查找的数,这时候问题就来了,链表的值多是整型,也多是字符,不一样的类型对应的参数类型也不一样,比较的方式也不一样,这时候就须要用到回调函数,能够写一个比较两个值的函数,而后把函数地址赋值给一个函数指针,函数指针看成参数放到功能函数里做为第三个参数,功能函数就能够经过函数指针调用比较函数,并把两个值传给回调函数,比较函数获取到两个值后,经过强制类型转换比较两个值,返回结果。代码如图
但愿能够经过这两个例子帮助你们理解回调函数的使用,回调函数本质上就是函数指针的原理
转载请注明出处、做者,谢谢