函数指针 与 回调函数


什么是函数指针

函数指针是指向函数首地址的指针(因为函数也是占用一定内存的)

例如我们先写一个函数如下:

int add(int a, int b){ return a + b; }

如何定义一个函数指针

用(*指针名)替换函数名,剩下的照抄

定义函数指针方式一:

int(*pAdd)(int a, int b) = NULL;

定义函数指针方式二(跟方式一是等效的):

	int(*pAdd2)(int,int);
	pAdd2 = NULL;

如何初始化函数指针

初始化函数指针必须类型一致,返回值一致,参数类型一致,除了函数名不同以外,其他地方必须完全相同

使用函数名初始化,或者用&加上函数名初始化

	//初始化函数指针,以下两种方式都可以
	pAdd = add; //从这里也可以看出  函数名的本身也是一个函数指针 所以在易语言里 可以直接用 &函数名 来当参数使用
	pAdd = &add;


如何使用函数指针调用函数

方式一:,如下:

	//方式一:直接使用函数指针名 替换函数名调用函数
	int c=pAdd(5, 6);
	//方式二: (*指针名)替换函数名去调用函数
	int d=(*pAdd)(5, 6);


回调函数

回调函数就是以函数指针为参数的函数,在启动线程里经常会用到

首先我们声明一个 以函数指针为参数的函数

//函数一 : 取最大数
int Max(int a, int b){ return a > b ? a : b; }
//函数二 : 两个数相加
int add(int a, int b){ return a + b; }
/*函数三:参数一为函数指针的函数*/
void jisuan(int(*pFun)(int, int),int a, int b){
	int c= pFun(a, b);
	printf("%d\n", c);
}

以上函数三的第一个参数为一个函数指针 int(*pFun)(int, int)

然后调用jisuan这个函数 并以函数指针为参数

	/*调用以函数指针为参数的函数*/
	jisuan(Max, 5, 6);
	jisuan(add, 5, 6);//add并没有单独声明他是一个指针,只声明了函数,从这里可以看出,函数名的本身就是一个函数指针

add和Max都没有单独声明他是函数指针  可以看出 函数名的本身也是就是一个函数指针,可以直接使用

所以易语言里 可以直接用 &函数名 当回调函数的参数

我们还可以继续套娃

	/*继续套娃 使用函数指针来调用 jisuan()*/
	void(*p)(int(*)(int, int), int, int);//声明函数指针
	p = jisuan;//赋值
	p(add, 500, 600);//调用


以上就是函数指针的全部内容  下面是完整代码:

#include <stdio.h>
//运算1
int Max(int a, int b){ return a > b ? a : b; }
//运算2
int add(int a, int b){ return a + b; }
/*参数一为函数指针的函数*/
void jisuan(int(*pFun)(int, int),int a, int b){
	int c= pFun(a, b);
	printf("%d\n", c);
}


int main(){
	/*定义函数指针*/
	int(*pAdd)(int a, int b) = NULL;

	//等效于下面两行
	int(*pAdd2)(int,int);
	pAdd2 = NULL;


	//初始化函数指针,以下两种方式都可以
	pAdd = add;  
	pAdd = &add;


	//使用函数指针调用函数方式一
	int c=pAdd(5, 6);
	//使用函数指针调用函数方式二
	int d=(*pAdd)(5, 6);
	printf("%d\n",c);
	printf("%d\n",d);


	/*调用以函数指针为参数的函数*/
	jisuan(Max, 5, 6);
	jisuan(add, 5, 6);//add并没有单独声明他是一个指针,只声明了函数,从这里可以看出,函数名的本身就是一个函数指针 这里的add 也可以写 &add

	/*继续套娃 使用函数指针来调用 jisuan()*/
	void(*p)(int(*)(int, int), int, int);//声明函数指针
	p = jisuan;//赋值
	p(add, 500, 600);//调用

	//上面的声明函数指针有点复杂了,可以使用typedef来简化
	typedef void(*pJisuan)(int(*)(int, int), int, int);
	pJisuan f = jisuan;
	f(add, 50, 60);

	getchar();
	return 0;
}

视频教程:https://www.bilibili.com/video/BV1R14y1878N