C语言二维数组的定义和使用(非常详细)
假设有一个名为 A 的一维数组,它包含了 10 个 int 类型的元素。另外,还有一个名为 B 的数组,它包含了 5 个元素,每个元素都是一个包含 10 个 int 元素的数组,如下图所示:

图 1 数组作为数组的元素
我们知道如何声明一个包含 10 个 int 元素的数组 A,即使用 int A[10]进行声明。那么,如何声明一个包含 5 个元素、每个元素都是一个包含 10 个 int 元素的数组 B 呢?
首先,让我们回顾数组的声明公式,如下图所示:

图 2 数组的声明公式
数组的声明包含了数组名、元素类型和元素数量三个要素。
现在,我们可以尝试声明一个名为 B 的数组,元素类型为 int[10],元素数量为 5。根据上述公式,我们可以得出以下声明:

图 3 数组的声明公式
通过使用数组名[下标]的形式,我们可以访问数组内的元素。例如,B[0]是数组 B 的第一个元素,而数组 B 的每个元素都是一个 int[10] 类型的数组,如下图所示。

图 4 数组第一层
要进一步访问数组 B[0] 中的 int 元素,我们需要使用 B[0][0] 这样的形式。这将访问第一个元素中的第一个元素,如下图所示:

图 5 访问二维数组
我们可以看到,数组构成了一个二维的矩阵,并且可以通过下标轻松地访问它的每个元素。
对于一个二维数组,由于它的每个元素都是一个数组,因此我们可以使用以下方式对它进行初始化:
与一维数组相似,如果初始化列表中的常量个数少于元素个数,则剩余元素将使用 0 进行初始化:
另外,我们也可以省略内层花括号,代码如下:
省略内层花括号时,如果元素的个数不足,那么后续的元素也将使用 0 进行初始化,代码如下:
下面是一个示例程序,它定义一个二维整型数组 B,其中包含 5 个一维数组,每个一维数组中有 10 个整数。
下面是一个修改二维数组元素的示例,它将二维数组中的每个元素都设置为原来的 2 倍:

图 1 数组作为数组的元素
我们知道如何声明一个包含 10 个 int 元素的数组 A,即使用 int A[10]进行声明。那么,如何声明一个包含 5 个元素、每个元素都是一个包含 10 个 int 元素的数组 B 呢?
首先,让我们回顾数组的声明公式,如下图所示:

图 2 数组的声明公式
数组的声明包含了数组名、元素类型和元素数量三个要素。
现在,我们可以尝试声明一个名为 B 的数组,元素类型为 int[10],元素数量为 5。根据上述公式,我们可以得出以下声明:
int[10] B[5];但还需要将数组名左边的方括号都移到最右边:
int B[5][10];这样,我们就成功地声明了一个名为 B 的数组,它包含了 5 个元素,每个元素都是一个包含 10 个 int 元素的数组,如下图所示。

图 3 数组的声明公式
通过使用数组名[下标]的形式,我们可以访问数组内的元素。例如,B[0]是数组 B 的第一个元素,而数组 B 的每个元素都是一个 int[10] 类型的数组,如下图所示。

图 4 数组第一层
要进一步访问数组 B[0] 中的 int 元素,我们需要使用 B[0][0] 这样的形式。这将访问第一个元素中的第一个元素,如下图所示:

图 5 访问二维数组
我们可以看到,数组构成了一个二维的矩阵,并且可以通过下标轻松地访问它的每个元素。
二维数组的初始化
我们已经学习了如何初始化一维数组,例如:int A[10] = {0, 1, 2, 3, 4, 5 ,6 ,7 ,8 ,9};
对于一个二维数组,由于它的每个元素都是一个数组,因此我们可以使用以下方式对它进行初始化:
int B[5][10] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, {30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49} };
与一维数组相似,如果初始化列表中的常量个数少于元素个数,则剩余元素将使用 0 进行初始化:
int B[5][10] = { {0, 1, 2, 3, 4, 5}, {10, 11, 12, 13, 14, 15}, {20, 21, 22}, {30}, {0} };
另外,我们也可以省略内层花括号,代码如下:
int B[5][10] ?= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 }
省略内层花括号时,如果元素的个数不足,那么后续的元素也将使用 0 进行初始化,代码如下:
int B[5][10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }
访问二维数组
由于二维数组有两个下标,我们通常使用嵌套循环来遍历它。下面是一个示例程序,它定义一个二维整型数组 B,其中包含 5 个一维数组,每个一维数组中有 10 个整数。
#include <stdio.h> int main() { int B[5][10] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, {30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49} }; for(int i = 0; i < 5; i++) { for(int j = 0; j < 10; j++) { printf("%d ", B[i][j]); } printf("\n"); } return 0; }我们使用了两个 for 循环遍历整个二维数组 B,外层循环控制行,内层循环控制列。对于每个数组元素,我们使用了 B[i][j] 的形式对其进行访问。运行结果为:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
修改二维数组元素
修改二维数组元素同样使用赋值运算符,代码如下:B[i][j] = B[i][j] * 2; // 修改二维数组值
下面是一个修改二维数组元素的示例,它将二维数组中的每个元素都设置为原来的 2 倍:
#include <stdio.h> int main() { int B[5][10] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, {30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49} }; for(int i = 0; i < 5; i++) { for(int j = 0; j < 10; j++) { B[i][j] = B[i][j] * 2; // 修改二维数组值 printf("%d ", B[i][j]); // 输出修改后的值 } printf("\n"); } return 0; }运行程序后,结果为:
0 2 4 6 8 10 12 14 16 18
20 22 24 26 28 30 32 34 36 38
40 42 44 46 48 50 52 54 56 58
60 62 64 66 68 70 72 74 76 78
80 82 84 86 88 90 92 94 96 98