二维数组可以表示表格、矩阵、棋盘或地图。它本质上是“数组中的数组”:第一个下标选择行,第二个下标选择该行里的列,两个下标都从 0 开始。
创建与访问
int grid[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("%d\n", grid[0][0]); // 1
printf("%d\n", grid[1][2]); // 7互动实验
行列坐标导航器
访问权限免费
点击矩阵中的一个值,观察第一个下标选中行、第二个下标选中列。
知识测验
题目
grid[1][2] 中的第一个下标 1 表示什么?
行数与列数
内置二维数组的每一行列数相同。示例把行数和列数分别保存在 rows 与 cols 中;不规则结构需要指针或容器,将在后续课程介绍。
int triangle[3][3] = {
{1, 0, 0},
{1, 2, 0},
{1, 2, 3}
};
int rows = sizeof triangle / sizeof triangle[0];
int cols = sizeof triangle[0] / sizeof triangle[0][0];知识测验
题目
哪个表达式得到二维数组 matrix 的行数?
嵌套循环
外层循环控制行,内层循环控制列。矩形数组的内层上限使用 cols,这样维度只需在一个位置维护。
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 4; col++) {
printf("%4d", grid[row][col]);
}
printf("\n");
}知识测验
题目
遍历矩形二维数组时,内层循环上限最好写成什么?
矩阵加法
矩阵加减法要求形状相同。位置 i,j 的结果只和两个输入矩阵相同位置的元素有关。
int a[3][2] = {{1, 3}, {1, 0}, {1, 2}};
int b[3][2] = {{0, 0}, {7, 5}, {2, 1}};
int result[3][2] = {0};
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 2; col++) {
result[row][col] = a[row][col] + b[row][col];
}
}互动实验
逐格完成矩阵加法
访问权限免费
左侧保留两个输入矩阵,右侧结果矩阵从空白开始;每次点击“下一步”只计算并填入一个对应位置。
A
+131012
B
007521
C
??????
当前坐标[0][0]
C[0][0] = 1 + 0 = 1紫色格表示本次要读取和写入的位置。
知识测验
题目
两个矩阵可以相加的前提是什么?
二维数组统计
统计前先确定范围:一行、一列,还是整个表格。下面的代码计算指定行的平均值;强制转换为 double 可以避免整数除法。
int row = 1;
int sum = 0;
for (int col = 0; col < 4; col++) {
sum += grid[row][col];
}
double average = (double) sum / 4;动手练习
实现两个矩阵相加
创建两个 3×2 的 int 二维数组,使用嵌套循环生成结果矩阵,并按 3 行 2 列打印。不要手工写出每个和。
- 使用二维数组保存 A、B 和结果 C。
- 用两层循环访问相同的 row、col 坐标。
- 计算 C[row][col] = A[row][col] + B[row][col] 并按行输出。
动手练习
找出每一行的最大值
使用二维数组 {{4,9,2},{7,1,8},{3,6,5}}。对每一行分别寻找最大值,最终输出 9 8 6。
- 外层循环逐行处理矩阵。
- 每行先用第一个元素初始化 row_max。
- 内层循环比较剩余列,结束后输出当前行最大值。