C语言二维数组:别再被“矩阵”吓到了,这不就是个“宿舍楼”嘛!

今天我们来聊聊C语言里那个听起来就很“数学大佬”的东西——二维数组

说实话,第一次听到“二维数组”这四个字,我脑子里浮现的是《黑客帝国》里那种绿色的代码雨,或者是高数课上让人头秃的矩阵。但真正搞懂之后才发现:害,这不就是学校里的宿舍楼吗?


一、二维数组是个啥?-----把它想象成宿舍楼

官方解释:二维数组是相同类型元素按行和列排列的矩形集合。

也可以这么理解:一维数组是一条走廊上的储物柜,那二维数组就是把几条一模一样的走廊叠在一起,变成了一栋楼

  • 第一维 [ ]:楼层号(第0层、第1层…)

  • 第二维 [ ]:房间号(0号房、1号房、2号房…)

比如你定义:

意思就是:这栋楼有2层,每层3个房间,每个房间里住着一个int型的学生


二、怎么盖这栋楼?----- 创建与初始化

1. 基础语法(拿地盖楼)

type arr_name[行数][列数];

代码如下所示:

重点来了!很多人这里会晕:

二维数组的本质:它其实是个“数组的数组”。

arr[2][3]意思是:有2个元素,每个元素都是一个长度为3的一维数组。

2. 装修房子:三种初始化方式(和一维数组也是类似的)

完全初始化(精装修)

系统会自动按行填满:

第0行:1 2 3
第1行:4 5 6
分行初始化(推荐!最清晰)

这就相当于告诉包工头:“第一层放1、2、3,第二层放4、5、6。”

不完全初始化(简装)

没填的地方,系统会自动补0:

第0行:1 2 0
第1行:4 0 0
偷懒小技巧:行可以省,列不能省!

为啥?因为系统需要知道一行几个房间,才能知道怎么分行啊!


三、怎么找人?----- 二维数组的下标访问

二维数组的访问规则非常简单:

数组名[楼层][房间号]

比如:

1. 挨家挨户敲门(遍历数组)

想看看整栋楼住了谁?用双层循环:

2. 给房间安排新住户(输入数据)


四、宿舍楼在内存里长啥样?------ 连续存储的秘密

你以为每层楼是分开建的?错!二维数组在内存里也是一整块连续的空间

来看个地址打印:

输出大概是这样:

&arr[0][0] = 0x7ffd...0c
&arr[0][1] = 0x7ffd...10  ← 差4(int占4字节)
&arr[0][2] = 0x7ffd...14
&arr[1][0] = 0x7ffd...18  ← 紧接上一行
&arr[1][1] = 0x7ffd...1c
&arr[1][2] = 0x7ffd...20

二维数组本质就是一维数组按顺序铺开,只是我们人为地给它分了行和列。


五、实战练手:矩阵转置(把楼横过来放)

这是一个经典题:

把3×3矩阵的行和列互换

原矩阵:

1 2 3
4 5 6
7 8 9

转置后:

1 4 7
2 5 8
3 6 9

思路(重点!):

第i行第j列 ↔ 第j行第i列

而且只需要交换对角线一侧的元素,不然换两次又回去了。

代码实现:


六、C99新特性:变长数组(VLA)

以前盖楼,楼层数必须是死的:

C99之后,你可以根据入住人数动态决定楼有多大:

注意事项:

  1. 不能初始化(因为编译时不知道多大)

  2. 数组大小一旦确定,就不能再改了

  3. VS2022不支持,但GCC和很多OJ平台都支持


七、总结一下(划重点!)

二维数组是一维数组的扩展结构,就像单间公寓升级为多层住宅。处理矩阵问题时,可以类比查找公寓:先确定楼层(行),再定位房间号(列)。通过这种系统化的梳理,能够帮助我们更清晰地把握知识体系的整体架构和内在逻辑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值