前言
因为程序一直有用到这个回调函数,虽然能够大概看得懂,知道是把函数指针从一个类传到另一个类,给这另一个类用,但是,里面具体详细的内容不太明确。在这里,稍微记录一下。
正文
首先,我们先了解一下函数指针是啥东西?
函数指针
定义:指向存放函数空间首地址的指针变量。
解析:函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。
回调函数
定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针地址作为参数传递给另一个函数,当这个指针被用来调用它所指向的函数的时候,我们就说这是回调函数。
为何要使用回调函数?
- 因为有些时候,我们调用函数的时机是:当触发某个特定的事件,这个时候调用你定义的函数。而如果采用一般的方法,你可能需要去用啥信号槽进行一定的监听,监听你所要控制的事件的时机。而用回调函数,就不存在这个问题。你只需要把函数传到对应的函数中,当这个函数执行时,它自然就会调用这个回调函数,从而执行你所需要的功能。
- 第二种解释方式:注册回调简单解释就是一个高层调用底层,底层再回过头来调用高层,这个过程就叫注册回调, 连接高层和底层就叫注册回调函数。高层程序C1调用底层程序C2,而在底层程序C2 又调用了高层程序C2的callback函数,那么这个callback函数对于高层程序C1来说就是回调函数。 在设计模式中这个方式叫回调模式。
例子
这篇文章讲了一个例子,值得探讨一下,这应该也是我能想到的回调的一个用处。
比如,我们写A B C D 四个函数,封装成一个库文件,然后我们的主函数里面要写一个功能函数,这个功能要用到函数A,假如不用函数指针,这个功能函数就要调用函数A,下次如果用到函数B,那么我们得删掉A,调用函数B,每次都要修改这个函数很麻烦,但如果使用回调函数就不一样了,我们可以定义4个函数指针,把4个函数的地址分别赋给4个函数指针,然后将函数指针当作参数传递给功能函数,功能函数就可以通过修改参数来调用对应的函数,而它本身不用做任何的修改。这样的话,功能函数就可以根据不同的情况,通过函数指针去调用不同的函数,代码如下:
#include <stdio.h>
#include <stdlib.h>
float ADD