C 语言 —— 多维数组

多维数组其实就是二维数组的继续延申,而且在正常项目中,常用的多维数组就是二维数组了,因此下面我们重点介绍一下二维数组的定义、初始化以及使用。

1. 什么是二维数组?

我们之前介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。
在实际问题中有很多量是二维的或多维的,因此 C 语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。
二维数组就是有两个下标的数组,是常用的多维数组,更高维的数组其实使用的并不多。

2. 二维数组的定义

二维数组定义的一般形式:

type array_Name[n][m];

PS:type 是数组元素的类型,array_Name 是数组名,n 和 m 为常量表达式。

float rain[5][12];

应该如何理解这个数组?
事实上,C 语言依旧将二维数组识别为一维数组,只不过数组的元素不再是如 int 类型的变量了,而是一个数组。那么 rain[5][12] 是有 5 个元素的数组,其中每个元素是一个含有 12 个元素的数组,还是有 12 个元素的数组,其中每个元素是一个含有 5 个元素的数组呢?
这个问题在于 [] 这个运算符的结合方向,[] 是自左向右的,因此编译器识别 rain[5][12] 时,会先和 [5] 结合,认为 rain 是一个含有 5 个元素的数组,然后识别 [12] 认为 rain 的每一个元素都是一个含有 12 个元素的数组。
根据以上分析可知,rain 的首元素 rain[0] 是一个内含 12 个 float 类型值的数组。所以,rain[1]、rain[2]等也是如此。如果 rain[0] 是一个数组,那么它的首元素就是 rain[0][0],第 2 个元素是 rain[0][1],以此类推。简而言之,数组 rain 有 5 个元素,每个元素都是内含 12 个 float 类型元素的数组,rain[0] 是内含 12 个 float 值的数组,rain[0][0] 是一个 float 类型的值。假设要访问位于 2 行 3 列的值,则使用 rain[2][3](记住,数组元素的编号从 0 开始,所以 2 行指的是第 3 行)。
这里对于二维数组,我们往往会采用数学上的行和列来描述,行指的是第一个[],列指的是第二个[]。这也是因为用二维视图有助于理解二维数组的两个下标。
image.png

3. 二维数组的初始化

初始化二维数组是建立在初始化一维数组的基础上。首先,初始化一维数组如下:

sometype ar1[5] = {val1, val2, val3, val4, val5}; 

这里,val1、val2 等表示 sometype 类型的值。例如,如果 sometype 是 int,那么 val1 可能是 7;如果 sometype 是 double,那么 val1 可能是 11.34,诸如此类。

int arr1[3][4];

如上所示的 arr1 是一个内含 3 个元素的数组,每个元素又是内含 4 个 int 类型元素的数组。所以,对 arr1 而言,val1 应该包含 4 个值,用于初始化内含 4 个 int 类型元素的一维数组。也就是说,因此,为了初始化二维数组 arr1,要用逗号分隔 3 个这样的数值列表:

int arr1[3][4] = {{1, 1, 2, 3}, {2, 4, 5, 3}, {3, 4, 5, 2}};

这个初始化使用了 3 个数值列表,每个数值列表都用花括号括起来。第 1 个列表的数据用于初始化数组的第 1 行,第 2 个列表的数据用于初始化数组的第 2 行,以此类推。
前面讨论的数据个数和数组大小不匹配的问题同样适用于这里的每一行。也就是说,如果第 1 个列表中只有 2 个数,则只会初始化数组第 1 行的前两个元素,而后两个元素将被默认初始化为 0。如果某列表中的数值个数超出了数组每行的元素个数,则会出错,但是这并不会影响其他行的初始化。

PS:做牛客上的题时,有遇到一个题说初始化二维数组时,{} 中没有任何元素会报错,实践之后发现是可以正确执行的,而且没有任何资料说 {} 是错误的。

初始化时也可省略内部的花括号,只保留最外面的一对花括号。只要保证初始化的数值个数正确,初始化的效果与上面相同。但是如果初始化的数值不够,则按照先后顺序逐行初始化,直到用完所有的值。后面没有值初始化的元素被统一初始化为0。

这两种初始化的区别:
image.png

4. 二维数组的使用

二维数组和一维数组相同,有数组表示法和指针表示法,其中指针表示法在指针处讲解。数组表示法和一维数组类似。

array[4][6]; // array 数组第5行第6列的元素

5. 其他多维数组

前面讨论的二维数组的相关内容都适用于三维数组或更多维的数组。可以这样声明一个三维数组:

int box[10][20][30]; 

可以把一维数组想象成一行数据,把二维数组想象成数据表,把三维数组想象成一叠数据表。例如,把上面声明的三维数组 box 想象成由 10 个二维数组(每个二维数组都是20行30列)堆叠起来。

还有一种理解 box 的方法是,把 box 看作数组的数组。
也就是说,box 内含 10 个元素,每个元素是内含 20 个元素的数组,这 20 个数组元素中的每个元素是内含 30 个元素的数组。或者,可以简单地根据所需的下标值去理解数组。

通常,处理三维数组要使用 3 重嵌套循环,处理四维数组要使用 4 重嵌套循环。对于其他多维数组,以此类推。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值