
一起动脑筋 · 先看一个小故事
女孩按“第几排、第几个座位”找同学。机器人也能用两个下标找一格数据。
把过程摊开来看
- 先选行行下标 1
- 再选列列下标 2
- 定位第二行第三列
二维数组可用行与列组成的表格理解。
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;列下标合法也不能弥补行越界。