二维数组知识汇总
编程小白也能轻松理解的二维数组基础知识与可视化
什么是二维数组?
二维数组就像是一个由行和列组成的表格或网格。想象一下Excel表格:
二维数组可视化
A1
A2
A3
A4
B1
B2
B3
B4
C1
C2
C3
C4
4列 × 3行的表格结构
大白话解释: 二维数组就是”数组的数组”。普通数组是一排盒子,二维数组是多排盒子组成的网格,每个盒子可以存储一个值。
声明与初始化
创建二维数组的方式有多种:
// 直接初始化一个3行2列的数组
int matrix[3][2] = {
{1, 2}, // 第一行
{3, 4}, // 第二行
{5, 6} // 第三行
};
// 创建后再赋值
int grid[2][3];
grid[0][0] = 10; // 第一行第一列
grid[0][1] = 20; // 第一行第二列
// …依此类推
int matrix[3][2] = {
{1, 2}, // 第一行
{3, 4}, // 第二行
{5, 6} // 第三行
};
// 创建后再赋值
int grid[2][3];
grid[0][0] = 10; // 第一行第一列
grid[0][1] = 20; // 第一行第二列
// …依此类推
初始化后的数组:
1
2
3
4
5
6
3行 × 2列的整数数组
访问数组元素
使用两个索引访问元素:[行索引][列索引]
// 获取第2行第1列的元素(索引从0开始)
int value = matrix[1][0]; // 值为3
// 修改第3行第2列的元素
matrix[2][1] = 100;
// 遍历二维数组
for (int i = 0; i < 3; i++) { // 遍历行
for (int j = 0; j < 2; j++) { // 遍历列
printf(“%d “, matrix[i][j]);
}
printf(“\n”); // 换行
}
int value = matrix[1][0]; // 值为3
// 修改第3行第2列的元素
matrix[2][1] = 100;
// 遍历二维数组
for (int i = 0; i < 3; i++) { // 遍历行
for (int j = 0; j < 2; j++) { // 遍历列
printf(“%d “, matrix[i][j]);
}
printf(“\n”); // 换行
}
重要提醒: 索引从0开始!第一行是0,第一列也是0。
内存中的存储方式
二维数组在内存中是按行连续存储的:
内存布局示意图
行0列0
值:1
行0列1
值:2
行1列0
值:3
行1列1
值:4
行2列0
值:5
行2列1
值:6
按行顺序连续存储在内存中
内存地址计算:
元素地址 = 基地址 + (行索引 × 列数 + 列索引) × 元素大小
常见操作
二维数组的常用操作:
- 遍历: 使用嵌套循环(行循环在外,列循环在内)
- 搜索: 遍历所有元素查找特定值
- 求和: 计算所有元素的总和
- 行/列操作: 对特定行或列进行计算
- 转置: 行列交换(行变列,列变行)
// 计算所有元素的总和
int sum = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
sum += matrix[i][j];
}
}
// 查找最大值
int max = matrix[0][0];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
if (matrix[i][j] > max) {
max = matrix[i][j];
}
}
}
int sum = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
sum += matrix[i][j];
}
}
// 查找最大值
int max = matrix[0][0];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
if (matrix[i][j] > max) {
max = matrix[i][j];
}
}
}
实际应用场景
二维数组在编程中有广泛应用:
- 游戏开发: 棋盘(象棋、五子棋)、地图网格
- 图像处理: 像素矩阵(每个元素代表一个像素颜色)
- 数据表格: 存储电子表格数据
- 数学计算: 矩阵运算(线性代数)
- 图形处理: 存储3D模型的顶点数据
- 人工智能: 神经网络权重存储
国际象棋棋盘示例
♜
♞
♝
♛
♚
♝
♞
♜
8×8的二维数组表示棋盘状态
注意事项
使用二维数组时需要特别注意:
- 边界检查: 访问超出范围的索引会导致程序崩溃
- 内存占用: 大数组会占用大量内存(行×列×元素大小)
- 初始化: 局部数组不会自动初始化,包含垃圾值
- 行列顺序: 循环嵌套顺序影响性能(行优先循环效率更高)
- 动态分配: 对于动态大小的数组,需要使用指针和内存分配
// 安全的访问方式(避免越界)
int rows = 3, cols = 2;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// 安全访问元素
}
}
int rows = 3, cols = 2;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// 安全访问元素
}
}