函数指针与回调函数

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就被叫做“回调函数”。
这里只是传入了那个函数的指针。
posted @ 2020-01-02 14:17  头上有多云  阅读(325)  评论(0)    收藏  举报