持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
🚩write in front🚩
🔎大家好,我是泽奀,希望你看完后。能对你有所帮助,不足请指正,共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金⇿InfoQ创作者~周榜34»总榜1712🏅
🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠
📝个人主页-掘金 (juejin.cn)💬
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏-[C系列] 从0到1 - 泽奀的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
💥 函数指针数组
说函数指针数组的时候,先让我们来回顾下整形指针数组。
int* arr[5];
这是整形指针数组 — 就是这里面存放的都是整形指针。
那么函数指针数组 — 就是存放函数指针的数组。
示例,如下代码所示 👇
#include<stdio.h>
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int main(void)
{
int(*p1)(int, int) = &add;
int(*p2)(int, int) = ⊂
int(*Funtwo[2])(int, int) = { add, sub };//(13)
return 0;
}
int(*Funtwo[2])(int, int) = { add, sub };
int(*Funtwo[2])(int, int) = { &add, &sub };
这两种写法都是一样的、取地址和不取地址、在函数都是一样的。解释上述代码👆:Funtwo首先和 [ ] 进行结合,和 [ ] 结合的时候就说明是个数组,数组是具有两个元素。那么当 Funtow[2] 被去掉的时候,剩下的就是函数指针了,int (*)(int,int); 加[2]是因为只是打算放入两个函数进去,那么③个④个都是一样以此类推......(13)
然后,就是对数组进行初始化。放入相应的函数进去即可!上述代码当中就放入了add、sub函数。
💥重点核心:函数指针数组里面就可以存放同类型的函数指针! (数据类型同、且能存放多个)
🔥 函数指针数组应用
其实主要实现在当你创建的函数过多的时候,可以用函数指针数组来进行接收进行初始化。
例如假设你有多个函数的时候,当然单个函数也行。就假设你有多个函数的时候。
示例,如下代码所示 👇
int(*pa[4])(int,int) = {max1,max2,max3,max4};
那么就可以用函数指针对应的下标来存放多少的函数的地址了,其实和指针数组特别类似。
💥 指向函数指针数组指针
指向函数指针数组的指针是一共指针指针指向一共数组,数组的元素都是函数指针。
函数指针的数组本质上是数组,取出函数指针数组的地址。
整形数组,示例,如下代码所示 👇
int arr[3];
int(*pa1)[3] = &arr;
整形指针数组,示例,如下代码所示 👇
int* arr[2];
int*(*pa2)[2] = &arr;
💥注意:在这里 pa2 是一个指向 整形指针数组 的指针!
那么接下来来说说函数指针数组 指针,示例,如下代码所示 👇
int (*p1)(int,int);//函数指针
int (*p2[5])(int,int);//函数指针数组
int(*(*p3)[5])(int,int) = &p2;//取出的是函数指针数组的地址
p3 就是一个指向 函数指针的数组 的 指针!
这里无非就是在p3加了个指针,然后用小括号括起来。之所以要用小括号,因为p3 会和 [ ] 进行结合。那么把 (*p3)[5] 去掉的话不就是函数指针了吗?你再一看(*p3)[5]不其实也是一个数组指针🤔
当然指向函数指针数组的指针这个东西知道就可以了,最主要的是去理解,不必深究,不然你将越套越深(doge)
🌀 回调函数
回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数的时候,当这个指针被用来调用其所指向的函数时,我们就说这个是回调函数,回调函数不是由函数实现方直接调用,而是在特定的时间发生时由另外的一方进行调用的,用于对该事件或条件进行响应。
也就是 A函数 B函数(A函数的地址)解释:把A函数的地址传递给B函数,那么B函数的形参一定是A函数的指针,因为指针里面才能够存A函数的地址。然后通过A函数的指针返回来调用A函数。那么这个A函数不是直接调用的,而是通过A函数当中的指针变量存放的这个地址。再回去调用A函数的时候,这个时候称之为这种机制叫做:回调函数!
简单讲:回调函数是由别人的函数执行时调用你实现的函数,也就是回调函数必须借鉴一个函数的参数为函数指针才行。
示例,如下代码所示 👇
#include<stdio.h>
int Callback_1(int x)
{
printf(" Hello, this is Callback_1: x = %d\n ", x);
return x;
}
int Callback_2(int x)
{
printf("Hello, this is Callback_2: x = %d\n ", x);
return x;
}
int Callback_3(int x)
{
printf("Hello, this is Callback_3: x = %d\n ", x);
return x;
}
int Handle(int y, int(*Callback)(int))
{
return Callback(y);//进行调用
}
int main(void)
{
int a = 2;
int b = 4;
int c = 6;
Handle(a, Callback_1);
Handle(b, Callback_2);
Handle(c, Callback_3);
return 0;
}
编译运行结果👇
Hello, this is Callback_1: x = 2
Hello, this is Callback_2: x = 4
Hello, this is Callback_3: x = 6
💥注意:回调函数是通过一个函数指针再进行调用的函数。