女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩按“第几排、第几个座位”找同学。机器人也能用两个下标找一格数据。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 先选行行下标 1
  2. 再选列列下标 2
  3. 定位第二行第三列

二维数组可用行与列组成的表格理解。

a[1][2] 先选下标为 1 的行,再选这一行下标为 2 的元素。两组下标都从 0 开始。

01为什么需要二维数组?

有些数据天然像表格:

  • 教室座位
  • 棋盘
  • 地图网格
  • 矩阵

这时一维数组不够直观,二维数组更合适。

02怎样声明二维数组?

int a[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
123456

可以把它看成 2 行、3 列。

03a[1][2] 表示什么?

第一个下标表示第几行,第二个下标表示这一行中的第几个元素。

a[1][2]   // 第 2 行、第 3 列,值是 6

因为行和列的下标也都从 0 开始。

04二维数组本质上是什么?

在 C++ 中:

int a[2][3];

可以理解成:a 是一个长度为 2 的数组,而 a 的每个元素又是一个长度为 3 的 int 数组。

05内存里怎样排列?

普通二维数组按行连续存储:

a[0][0]a[0][1]a[0][2]a[1][0]...

这通常叫行主序(row-major order)

06怎样遍历二维数组?

for (int row = 0; row < 2; row++) {
    for (int col = 0; col < 3; col++) {
        std::cout << a[row][col] << ' ';
    }
}

外层控制行,内层控制列。

07二维数组也会越界吗?

当然会。对于 int a[2][3]

  • 行下标只能是 0、1
  • 列下标只能是 0、1、2

a[2][0]a[0][3] 都越界。

你已经知道了什么

  • 二维数组适合表示行列结构。
  • int a[2][3] 表示 2 行、每行 3 个 int。
  • 二维数组本质上是数组的数组。
  • 普通二维数组按行连续存储。
  • 遍历二维数组通常使用嵌套循环。

下一篇:字符串是什么?

轮到你来试一试

2 行 3 列的数组,a[2][0] 合法吗?

想好了吗?点开看解释

不合法。行下标只能是 0 或 1;列下标合法也不能弥补行越界。