返回介绍

5.4.5 数组的数组

发布于 2025-04-11 22:32:58 字数 1899 浏览 0 评论 0 收藏 0

现在已经知道,在进行数组定义的时候,数组名后面的中括号被称为“维”。C 语言中,根据维的多少,我们可以把数组分为一维数组和多维数组。所谓多维数组,即维数大于 1 的数组,因此,二维数组也算是多维数组,只不过是最简单的多维数组罢了。

数组的数组感觉像是绕口令似的描述,让人听起来有点怪异,感觉不知所云。大家不要害怕,这其实并不是一个新的技术要点,只是对多维数组的一种新的思维模式。

大家试想一下,数组包含着若干的数组元素,若数组元素本身又是一个数组呢?或者反过来,我们是否可以将若干个长度和类型都相同的数组,作为数组元素存储到另一个数组当中呢?是的,按照这样的理解思路,我们就可以将二维数组看成是“一维数组的数组”。例如之前的 score 数组,它是一个 3 行 4 列的二维数组。我们可以将其中的每一行都看成是一个长度为 4 的 float 类型的一维数组,并将其定义为一种新的数据类型,那么 score 就是一个长度为 3 的这种新的数据类型的数组,如图 5.7 所示。

图 5.7 二维数组 score

图中的 3 行数据都是长度为 4 的一维数组,如果把每一个一维数组都看成是一个数组元素,那么二维数组 score 就是拥有 3 个这样数组元素的数组了。

大家还记得如何设置类型别名吗?对,使用“typedef”关键字。下面就通过 typedef 来为一个长度为 4 的 float 类型的一维数组设置别名:

typedef float ARRTYPE[4];

由于使用了 typedef,所以这里的 ARRTYPE 不再是一个普通的数组名,而是表示一个数据类型的别名,即 ARRTYPE 是一个“长度为 4 的 float 类型的一维数组”的类型别名。

因此,如果通过 ARRTYPE 来定义一个变量:

ARRTYPE arr;  //等价于  float arr[4];

现在,arr 是一个“长度为 4 的 float 类型一维数组”类型的变量,它与“float arr[4]”这种定义方式有着相同的效果。而对于 score 数组,现在可以这样定义:

ARRTYPE score[3];  //等价于  float score[3][4];

乍看之下,score 变成了一个一维数组,但实际上,score 是一个长度为 3 的“长度为 4 的 float 类型一维数组”类型的数组,因此,score 就是一个“数组的数组”。

我们还可以通过 sizeof 运算符来查看 score 数组的大小:

printf("Size of the score : %u Bytes.\n", sizeof score);

编译运行后,结果如下:

Size of the score : 48 Bytes.

从结果可见,score 的大小是 48 字节,每个数组元素都是 float 类型,它可以容纳 12 个数组元素,与之前所定义的 score 数组是相同的,无任何区别。

最后,再以这样的思想来理解一下 C 语言中的数组:

由普通元素(变量)构成的数组,是一维数组,即一维数组是普通元素(变量)的数组。

由一维数组构成的数组,是二维数组,即二维数组是一维数组的数组。

由二维数组构成的数组,是三维数组,即三维数组是二维数组的数组。

……

多维数组其实是对一维数组的多层嵌套,这样来理解,数组的逻辑结构是不是就更加清晰了?理解了数组的嵌套,再去理解指针与数组的关系,就会比较轻松。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。