函数指针与回调函数
2020年1月2日13:46:26
函数指针
一句话解释什么是函数指针.
函数指针本质是个指针,这个指针指向一个函数.
如何声明函数指针呢?
那我们考虑一下如何声明一个指针,如何声明一个函数,再将两者结合起来.
声明指针:
int *p;
声明函数:
int func(int a);//声明了一个返回值为int类型,参数为int的函数func
现在将两者结合起来:
int (*funcpointer)(int a);//按照指针的声明规则来读,应该是:这句话声明了一个指针funcpointer,这个指针是什么类型呢?它指向的类型就是它的类型.这个指针指向了一个 参数为int的返回值为int的函数 的类型
现在就很明确了我们声明对了.
现在我们再来看看这个函数指针怎么使用.
在解释怎么使用之前,我们来看看常见的指针是怎么使用的.
int a = 10;
int *p = NULL;
p = &a;
上面的三句话,我们很明确,哦 原来这个指针p指向了和它同类型的内容,这里的同类型是int.
所以指针的用法是:指针应该指向一个同类型的内容(地址)啊.
如何使用函数指针###
那现在我们来看看函数指针应该怎么使用.
一开始我们就说了一句话:
函数指针本质是个指针,这个指针指向一个函数.
这句话向我们传递的内容是:这个函数指针 应该指向一个内容或者说应该指向一个地址,而这个地址应该是一个函数的首地址.
类比数组,我们知道数组指针的这个指针应该指向一个和自己同类型的数组.这个类型就是形式上一致的,比如说数组的行数与数组里存的内容的类型.
到函数指针这里也同样是这个道理.那函数指针的同类型应该有谁呢?
我们看看函数的组成:返回值 函数名(参数列表);
可以看出,两个函数同类型说的是返回值一样,参数列表一样.这两个部分一样的函数,我们称之为同类型的函数.
那现在,我们声明了这个类型的指针.就意味着:声明的这个类型的函数指针,就应该也很合理的指向这样类型的函数
说了这么多的文字,可能要晕了.
那现在我们用代码来解释这个函数指针怎么用.
//声明一个函数
int func(int a);
//声明一个函数指针
int (*funcpointer)(int a);
//给函数指针赋值
funcpointer = func;
//调用
funcpointer(10);
这个使用就是简单的赋值.这里需要注意,我们使用指针的时候一般都是使用&符号取地址,这里的函数名指向的就是函数的地址,所以这里不用&了.
下面的调用才是使用函数指针.
这句话funcpointer(10);和func(10);效果是一样的,没有本质的不同.都是调用了func(10);.
有没有一种脱裤子放屁的感觉???
上面的使用,肯定是脱裤子放屁.
真正发挥函数指针的能力的是回调函数.在了解学习回调函数之前先来看一个小问题函数指针的声明
关于函数指针的声明
回调函数
回调函数:为了解耦而设计的一种函数调用形式,被作为参数传入其他函数的函数指针叫做回调函数。
例子
#include <stdio.h>
int callBack_1(){
printf("call back function 1 is callbacked!");
return 0;
}
int callBack_2(){
printf("call back function 2 is callbacked!");
return 0;
}
int handle(int *callBack){
printf("进入 handle 函数");
callBack();
printf("离开handle函数");
}
int main(){
printf("进入主函数");
handle(calBack_1);
handle(callBack_2);
printf("离开主函数");
}
handle函数的逻辑是处理给定的函数。那么传入不同的函数就会执行不同的动作。这就做到了解耦。这个传入的参数callBack就被叫做“回调函数”。
这里只是传入了那个函数的指针。

浙公网安备 33010602011771号