【C语言指针四】数组指针变量、二维数组传参本质、函数指针变量、函数指针数组

🎬 个人主页秦苒&
专栏传送门 :《C语言

🍀指尖燃热血,代码铸锋芒;以信仰破局,向顶峰生长


🎬秦苒&的简介:


前言:


文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、数组指针变量

1.1什么是数组指针变量

什么是数组指针呢?顾名思义就是指向数组的指针,其变量是指针变量。数组指针变量存放的是数组的地址。

这里我们着重对比一下对比:指针数组是元素为指针的数组,数组中存放的是地址(指针)。

老办法,照猫画虎!!

• 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向 整形 数据的指针。

• 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点 型数据的指针。

虎--->数组指针变量:存放的应该是数组的地址,能够指向数组的指针变量

语法格式

c 复制代码
int (*p)[10];//[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合

注意:p先和*结合,说明p是⼀个指针变量,然后指针指向的是一个大小为10个整型的数组。所以p是⼀个指针,指向⼀个数组,叫数组指针

2.2数组指针变量怎么初始化

我们怎么获得数组的地址呢?

c 复制代码
int arr[10] = {0};
&arr;//得到的就是数组的地址 

如果要存放整个数组的地址,就得存放在数组指针变量中

c 复制代码
int(*p)[10] = &arr;

二、二维数组传参本质

之前,我们有⼀个二维数组的需要传参给⼀个函数的时候,我们是这样写的:

接下来我们再学习一个新方法:

我们先回顾一下有关二维数组的知识。

怎么理解二维数组呢--->二维数组其实可以看做是每个元素是⼀维数组的数组,也就是二维数组的每个元素是一个一维数组。那么,二维数组的首元素就是第一行,是个⼀维数组。

我们结合图片理解一下:

继续我们的照猫画虎的思想!!根据数组名是数组首元素的地址这个规则,二维数组的数组名表示的就是第一行的地址,是一维数组的地址

第一行的⼀维数组的类型就是 int [5] ,所以第一行的地址的类型就是数组指针类型 int(*)[5] 。也就是说二维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的。如下图所示:

于是,我们得到结论:

二维数组传参,形参的部分可以写成数组,也可以写成指针形式

三、函数指针变量

3.1 函数指针变量的创建

什么是函数指针变量呢

函数指针变量就是用来存放函数地址的,未来通过地址能够调用函数的

地址?函数有地址吗?实践是检验真理的唯一标准

嗯···看来函数是有地址的。函数名就是函数的地址,当然也可以通过 &函数名 的方式获得函数的地址

函数指针类型解析:

其实我觉得学习指针用到好多照猫画虎的思想,嗯,这个也是:

如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针非常类似,我们继续看图:

c 复制代码
void test()
{
 printf("hehe\n");
}
void (*pf1)() = &test;
void (*pf2)()= test;
int Add(int x, int y)
{
 return x+y;
}
int(*pf3)(int, int) = Add;
int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的 

3.2 函数指针变量的使用

3.3typedef关键字

typedef是用来类型重命名的,可以将复杂的类型,简单化。

举个例子:

比如,你觉得 unsigned int 写起来不方便,如果能写成 uint 就方便多了,那么我们可以使用:

c 复制代码
typedef unsigned int uint;
//将unsigned int 重命名为uint 

那如果是指针类型,能否重命名呢?其实也是可以的,比如,将 int* 重命名为 ptr_t ,这样写:

c 复制代码
typedef int* ptr_t;

但是对于数组指针和函数指针稍微有点区别:

比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写

c 复制代码
typedef int(*parr_t)[5]; //新的类型名必须在*的右边

照猫画虎,函数指针类型的重命名也是⼀样的,比如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:

c 复制代码
typedef void(*pfun_t)(int);//新的类型名必须在*的右边

可以简化为

c 复制代码
pfun_t signal(int, pfun_t);

四、函数指针数组

数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组

比如:

c 复制代码
int * arr[10];
//数组的每个元素是int* 

把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组

看这个:

c 复制代码
int (*parr1[3])();
int *parr2[3]();
int (*)() parr3[3];

parr1 先和 [] 结合,说明parr1是数组,是 int (*)() 类型的函数指针


总结

围绕C语言中数组指针、函数指针相关的核心知识点展开系统讲解,从基础概念到实际应用,层层拆解了指针体系中这两类易混淆的重要内容,清晰梳理了其定义、

结尾

勇敢的寻宝者啊,这次旅途你挖掘到多少宝藏呢,苒苒很期待下次与您相遇!

结语:希望对寻找C语言相关内容的寻宝者有所帮助,不要忘记给博主"一键三连"哦!你的每一次鼓励都为我提供 了前行的动力!

小喵很期待与你再次寻宝奥 ᰔᩚ/•᷅•᷄\୭

相关推荐
秋雨雁南飞1 小时前
C# 字符串占位
开发语言·c#
拾贰_C1 小时前
[Python | pytorch | torchvision ] models like ResNet... 命名变量说明
开发语言·pytorch·python
傅里叶的耶1 小时前
C++ Primer Plus(第6版):第三章 处理数据
开发语言·c++
CC.GG2 小时前
【C++】AVL树
java·开发语言·c++
CoderCodingNo2 小时前
【GESP】C++四级真题 luogu-B4416 [GESP202509 四级] 最长连续段
开发语言·c++·算法
a程序小傲2 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展
⑩-2 小时前
Java四种线程创建方式
java·开发语言
月光在发光2 小时前
22_GDB调试记录(未完成)
java·开发语言
222you2 小时前
SpringAOP的介绍和入门
java·开发语言·spring