写点什么

【C 语言】进阶指针 Five

作者:謓泽
  • 2022 年 7 月 11 日
  • 本文字数:1948 字

    阅读完需:约 6 分钟

【C 语言】进阶指针 Five

🚩write in front🚩

🔎​​Hello,大家好我是謓泽,一起共同学习,多多指教(●'◡'●)🔎

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🖊

📢2021 年度博客之星物联网与嵌入式开发 TOP5~2021 博客之星 Top100~阿里云专家 ^ 星级博主~掘金⇿InfoQ 创作者~周榜 92»总榜 1430👋

💥 函数指针数组

说函数指针数组的时候,先让我们来回顾下整形指针数组。


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

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

发布于: 刚刚阅读数: 3
用户头像

謓泽

关注

一起happy! 2022.01.29 加入

谁也不知道旅途的终点是怎么样的,现在只不过是开始。便全力以赴!终点必将是星辰大海。 2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

评论

发布
暂无评论
【C 语言】进阶指针 Five_7月月更_謓泽_InfoQ写作社区