【C语言】进阶指针Five

259 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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) = &sub;
	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

💥注意:回调函数是通过一个函数指针再进行调用的函数。