今天我们来聊聊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之后,你可以根据入住人数动态决定楼有多大:

注意事项:
-
不能初始化(因为编译时不知道多大)
-
数组大小一旦确定,就不能再改了
-
VS2022不支持,但GCC和很多OJ平台都支持
七、总结一下(划重点!)

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

被折叠的 条评论
为什么被折叠?



