函数指针是指向函数首地址的指针(因为函数也是占用一定内存的)
例如我们先写一个函数如下:
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