欢迎光临散文网 会员登陆 & 注册

第 12 讲:二维数组

2021-09-05 19:45 作者:SunnieShine  | 我要投稿

前文我们讲到了一维数组的基本赋值方式和使用方式,但基本上我们可以看到,如果不是迫不得已的情况下,貌似一维数组已经够用了,不过为了教程的完整性,我们还是把一些其它情况,必须要更高维的数组的时候,它们的语法格式讲一下。今天说的是二维数组。


二维数组的定义

当我们在人为定义的情况下必须要使用两个维度(行和列)的时候,就不得不使用二维数组来定义,比如一个表格。比如,我们需要一个 3 行 4 列的表格,它的定义方式是这样的:

此时,我们需要在定义语句里写上两个中括号,一个表示行,一个表示列。这个地方的定义就表示一个二维数组是 3 行 4 列的。同时请你继续注意的地方是,这里的中括号是定义语句里用的,所以它表示这个数组是多少行多少列的,而并非取出第 3 行第 4 列的数据。请你注意这一点。

你也可以理解为,table 变量一共有三个元素构成,每一个元素都是一个需要 4 个元素的数组构成的一维数组序列。所以这种理解方式更类似于“是一个一维数组,只是每一个数据的类型是一个一维数组,即数组的数组”。


初始化赋值

在二维数组里,初始化赋值就比较麻烦了。比如,一种简单的赋值方式是采取“数组的数组”的理解方式来赋值的,比如这样:

即存放了三个元素,且每一个元素都是一个存四个 int 类型元素的一维数组的二维数组。和前文一样,二维数组当完整赋值后,可以不写出元素个数。但在二维数组里,只能省略行元素总数 3,而不可以省略列元素的总个数 4,即:

注意,这种设计是为了保证后续可以完整取出具体位置的元素而设计的。

数组在内存里的表达实际上都是一个一维数组。显然,内存是一个长条分布的形状,所以不管多少维度的数组,哪怕后面用到的更高维度的数组,在内存里都只可能表示成一个一维的数组形式,而一个二维数组需要列元素的个数这一个信息来正确分割整个数组,来保证二维数组的成立。如果你省略了列元素的个数,我们就无法在正确的地方断开这个数组,进而得不到正确结果。比如,一个数组拥有 12 个元素(3 行 4 列),那么它在内存里只能表示成这样:

这个表达形式可以看到,我们为一个一维数组进行正确的定界是必须要列元素数这个信息的。所以列元素总数这个数字是不可以省略的。

另外,二维数组也可以省略一些元素的赋值,此时将会默认赋值 0:

这样的话,整个数组的赋值的情况就是

当然,内部的大括号都可以被省略,但这个时候就不能省略中间的元素了:

和上面的逻辑一样,这个赋值方式依然是满足要求的,这样就可以看出赋值语句里列元素数这个信息的重要性了。

当然,它也可以不完全赋值:

那么,从第十个元素开始(从 0 开始算就是第 9 号元素)都被赋值为 0。


二维数组存取数值

按照 C 语言的规定,数组的索引从 0 开始(所谓的索引,就是取值和存值的那个中括号里的数值,它可以表示这个数组的第几个元素,这个数就是索引,有时候也称为下标,Index),所以二维数组的两个维度都是从 0 开始。

不过,二维数组需要两个索引,一个行索引,一个列索引:

那么,要取出第 10 个元素 5,应如何写呢?

即第 2 行第 1 列的元素(注意,这个索引数值是从 0 开始,所以第 2 行就是我们人为理解的第三行,而第 1 列就是我们理解的第二列),第三行第二列就是 5 了。

另外,初始化赋值可以这么写:

这样,整个数组的元素就被赋值为从 1 到 12 了,依然请你注意 for 循环的条件 i < 3j < 4


第 12 讲:二维数组的评论 (共 条)

分享到微博请遵守国家法律