二维数组
二维数组
数组是一种用于存储多个相同类型数据的数据结构。当数据具有行和列的结构特征时,就需要使用 二维数组 来进行描述,例如表格、矩阵、棋盘、成绩单等。
二维数组可以理解为:由多个一维数组组成的数组。
1. 二维数组的概念
一维数组可以表示一排数据,例如:
int a[5];
而二维数组可以表示多排多列的数据,例如:
int a[3][4];
表示一个 3 行 4 列 的整型数组。
从数学角度看,二维数组常用来表示一个矩阵:
其中 表示 第 行、第 列 的元素。
与一维数组相同,二维数组同样从下标 开始,最大下标分别为 行数-1 和 列数-1。
但一般我们在使用数组时为了与题目描述和生活习惯相一致,习惯存储从下标从 开始,最大下标分别为 行数 和 列数。所以定义二维数组时数组大小也要比最大的可能再大一些。
2. 二维数组的定义方式
二维数组的基本定义格式为:
数据类型 数组名[行数][列数];
例如:
int score[5][3];
表示 5 个学生、每人 3 门课成绩 的数组。
需要注意的是:
- 行数和列数都必须是常量
- 下标从 开始
- 最大下标分别为
行数-1和列数-1
3. 二维数组的初始化
完全初始化
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
等价于:
int a[2][3] = {1, 2, 3, 4, 5, 6};
数组在内存中是按行顺序连续存储的。
部分初始化:
int a[2][3] = {
{1, 2},
{4}
};
未赋值的元素会自动补 ,结果为:
省略行数初始化:
在初始化时,可以省略行数,但不能省略列数:
int a[][3] = {
{1, 2, 3},
{4, 5, 6}
};
系统会根据初始化数据自动推断行数。
4. 二维数组的访问
二维数组通过 两个下标 访问元素:
数组名[行下标][列下标]
例如:
a[1][2] = 10;
表示将第 行、第 列的元素赋值为 。
如果数组定义为 int a[3][4];,那么合法下标范围为:
- 行下标:
- 列下标:
5. 二维数组的遍历
二维数组通常使用 嵌套(双重)循环 进行遍历:
for(int i = 0; i < 行数; i++){
for(int j = 0; j < 列数; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
外层循环控制 行,内层循环控制 列。
二维数组中元素的总个数为:
双重循环本质上是对所有 组合进行枚举,对每行中的每一列位置进行访问。
6. 二维数组的常见应用
以成绩统计为例,将编号为 的学生成绩存到行号为 的行中:
int score[3][4]; // 3个学生,4门课程
- 行:学生编号
- 列:课程编号
计算编号为 的学生的总成绩:
for(int i = x; i <= x; i++){
int sum = 0;
for(int j = 0; j < 4; j++){
sum = sum + score[i][j];
}
cout << ans << endl;
}
6.2 矩阵运算
二维数组常用于矩阵问题,如矩阵加法:
代码实现:
c[i][j] = a[i][j] + b[i][j];
二维数组还可以用于表格与地图问题:
- 棋盘
- 地图
- 网格路径
- 雷区标记
二维数组可以直观表示 空间位置关系,但需要注意我们一般表示的矩阵表格与数学中的常规坐标系(笛卡尔坐标系)有所不同,要注意方向和变量表示的意义。
我们在分析样例时要注意行号与列号的变化方向,如果与样例的方向不同可能会导致无法理解样例。
7. 常见错误与注意事项
- 数组越界
a[3][0]; // 若行数为3,则下标3非法
- 行列顺序写反
a[列][行]; // 逻辑错误但不一定报错
- 列数不能省略
int a[][]; // 错误写法
总结
二维数组是对一维数组的扩展,用于描述具有 行列结构 的数据。其核心要点包括:
- 明确内外层循环变量的行与列的含义
- 正确理解下标从 开始
- 使用嵌套循环进行遍历
- 常用于矩阵、表格、地图等问题
在实际编程中,应先在逻辑上画出或想象数据的二维结构,再将其对应到数组下标,有助于减少错误,提高代码可读性。
本次题单设计了二维数组知识点,其中细化到二维数组的定义、使用、遍历以及特殊遍历等拓展内容。
通过学习本题单,你可以掌握二维数组的基本操作和遍历方法,学会处理行列顺序、边缘判断、方位表示以及嵌套统计等问题,从而提升对二维数据结构的理解与应用能力。
【后置衔接知识点】
1、前缀和
【思维导图】

【题目知识点分类】
