【C语言 | 指针】多级指针、多维数组

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍C语言多级指针、多维数组🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!


在这里插入图片描述

🎄一、概述

多维数组与多级指针也是初学者感觉迷糊的一个地方。超过二维的数组和超过二级的指针其实并不多用。如果能弄明白二维数组与二级指针,那二维以上的也不是什么问题了。所以本文重点讨论二维数组与二级指针。


在这里插入图片描述

🎄二、二级指针

✨2.1 二级指针的本质

在前面的文章 C指针详解 中从4个方面来认识指针,知道指针本质上就是一个4个字节(32位系统) 或 8个字节(64位系统) 的内存块,其里面存放的值都会被编译器当作内存地址来处理。
例如,下面语句:

char c = 'A';
char *p2 = &c;

可以用下图来表示,32系统分配一个4个字节的内存空间,命名为p2,里面存放了变量c的地址。
在这里插入图片描述


清楚了指针的本质之后,我们再看看二级指针,二级指针本质上也是一个4个字节(32位系统) 或 8个字节(64位系统) 的内存块,其里面存放的值也会被编译器当作内存地址来处理。不同的是,二级指针里面存放的是一级指针的内存地址
例如,下面语句,p是二级指针,其内容里存放了指针p2的地址:

char c = 'A';
char *p2 = &c;
char **p = &p2;

在这里插入图片描述
记住:一级指针保存的是数据的地址,二级指针保存的是一级指针的地址。


✨2.1 二级指针的使用

使用*对一个内地址解引用,就可以得到该内存地址的值。

二级指针保存的是一级指针的地址,对二级指针的值解引用,就得到一级指针的值,再对一级指针解引用才得到数据的值。

关于二级指针的使用,我们需要很清楚知道一级指针的地址数据的地址数据,这三个要怎样去表示,看例子2.2.1:

#include <stdio.h>
int main()
{
	char c = 'A';
	char *p2 = &c;
	char **p = &p2;
	
	printf("一级指针地址: %p %p\n",p, &p2);
	printf("数据地址: %p %p\n",*p, p2);
	printf("数据: %c %c\n",**p, *p2);
}

在这里插入图片描述

🎄三、二维数组

✨3.1 二维数组的本质

看了前面文章 C语言数组详解(经典,超详细) ,我们清楚数组的本质是一段连续的内存空间,可以存储除了函数之外的任何数据。
例如:下面代码

char a[3];

在内存中的存储就类似于下图:
在这里插入图片描述


二维数组,本质上也是一段连续的存储空间。与一维数组不同的是,一维数组的数组元素是除了数组之外的其他类型,而二维数组的数组元素是一个数组类型。
例如:下面代码

char a[3][4];

在内存中的存储就类似于下图,先看a[3]是一个数组,它有三个元素 ,每个元素都是一个数组类型的;这个数组类型有4个元素,每个元素是char类型:
在这里插入图片描述
也就是说,二维数组的本质也是一段线性的连续的存储空间,其内存结构先按照第一维度的元素个数,将整个数组内存空间分割为若干份(第一维度元素个数);再将每个份按照第二维度的元素个数分割为若干份(第二维度的元素个数)。


✨3.2 二维数组的使用

char a[3][4]; 为例,a、a[0]、a[0][0]分别表示什么?

前面文章讲过,一维数组的数组名作为右值时,代表了数组首个元素的地址。同样的,二维数组或者多维数组,其数组名也表示该数组第一维度的首个元素的地址。以char a[3][4];为例,数组名a的地址值会等于 &a[0]。数组名a做右值使用时,可以当成一个常量指针,指针类型是char *[4],所指向的类型是char [4],所以±1,会等同于±sizeof(char [4])个字节。

a[0]又表示什么,以char a[3][4];为例,这里的a[0]作为右值使用时,相当于第二维度数组的数组名。所以 a[0] 地址值会等于&a[0][0]a[1] 地址值会等于&a[1][0]a[0] 做右值使用时,也可以当成一个常量指针,指针类型是char *,所指向的类型是char,所以±1,会等同于±sizeof(char)个字节。

a[0][0]在这个例子中,是一个字符值了。类型是char

a[0]、a[0][0],还可以分别用*a**a 来表示。

看例子3.2.1:

#include <stdio.h>

int main()
{
	char a[3][4]={"abc","def","ghi"};
	printf("a=%p a[0]=%p a[0][0]=%c\n",a,a[0],a[0][0]);
	printf("a=%p &a[0]=%p \n",a,&a[0]);
	printf("a[0]=%p &a[0][0]=%p a[1]=%p &a[1][0]=%p\n",a[0],&a[0][0],a[1],&a[1][0]);
	
	printf("a+1=%p %lu a[0]+1=%p %lu\n",a+1, (unsigned long)a+sizeof(char [4]), a[0]+1, (unsigned long)a[0]+sizeof(char));
	
	printf("a[0]=%p *a=%p a[0][0]=%c **a=%c \n", a[0], *a, a[0][0], **a);
}

运行结果:
在这里插入图片描述

在这里插入图片描述

🎄四、多级指针

二级以上的指针很少用,写了几年代码了,从来没见过,但这里还是聊一聊。

遇到多级指针,我们还是要从其本质来理解,无论多少级的指针,在编译器看来都是一个4字节(32位系统)或8字节(64位系统)的一块内存,里面放着一个内存地址值。

看例子4.1:

#include <stdio.h>
int main()
{
	char c = 'c';
	char *pc = &c;
	char **ppc = &pc;
	char ***pppc = &ppc;
	char ****ppppc= &pppc;
	printf("ppppc=%p, pppc=%p, ppc=%p, pc=%p \n",ppppc, pppc, ppc, pc);
	printf("****ppppc=%c c=%c\n", ****ppppc, c);
	return 0;
}

只要清楚多级指针的本质,结合下面几句话就不那么模糊了。
四级指针存放的是三级指针的地址;
三级指针存放的是二级指针的地址;
二级指针存放的是一级指针的地址;
一级指针存放的是数据的地址;

在这里插入图片描述

🎄五、多维数组

二维数组以上的多维数组也很罕见。

不管多少维的数组,本质上都是一段连续的内存空间。然后把它每个维度单独当成一个数组去看待就好理解了。

例如:int a[3][4][5];

  • 第一维度:数组名a,有3个元素a[0]、a[1]、a[2],每个元素类型是int [4][5]
  • 第二维度:以a[1]为代表来看,数组名是a[1],有4个元素a[1][0]、a[1][1]、a[1][2]、a[1][3],每个元素类型是int [5]
  • 第二维度:以a[1][2]为代表来看,数组名是a[1][2],有5个元素a[1][2][0]、a[1][2][1]、a[1][2][2]、a[1][2][3]、a[1][2][4],每个元素类型是int

在这里插入图片描述

🎄六、总结

👉本文介绍C语言的二级指针、二维数组、多级指针、多维数组。

确实写完都有点懵了,有看见错误的,欢迎指正,这个主题确实容易错。
在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值