C语言二维数组详解(非常详细)
C语言中的二维数组可以看作是特殊的一维数组,其各个元素仍然是一个数组。
定义二维数组的形式如下:
不管是行下标还是列下标,其索引都是从 0 开始的。因此,一个 m 行 n 列的二维数组 array[m][n],其行下标取值范围为 0~m−1,列下标取值范围为 0~m−1,最大下标元素是 array[m−1][n−1]。
例如,定义一个 3 行 4 列的整型数组,代码如下:
二维数组 array[3][4] 共包含 12 个数组元素(3×4),分别为:
和一维数组一样,二维数组也要注意下标越界的问题。例如:
1) 将所有数据写在一个大括号内,按照数组元素排列顺序对元素赋值。例如:
如果大括号内的数据少于数组元素的个数,则系统会默认后面未被赋值的元素值为 0。
2) 为所有元素赋初值时,可以省略行下标,但不能省略列下标。例如:
系统会根据数据的个数进行分配,一共有 6 个数据,而数组分为 3 列,因此数组有 2 行。
3) 分行给数组元素赋值。例如:
在分行赋值时,可以只对部分元素赋值。例如,下面的代码中:
4) 直接对数组元素赋值。例如:
【实例】一个 3×3 的网格,将 1~9 的数字放入方格中(矩阵中心元素为 5),使得每行、每列以及每条对角线上的 3 个数相加都相同。通过键盘为二维数组元素赋值,并显示二维数组。
程序先依次输入相应的数组元素值,然后将这个 3 行 3 列的数组输出:
运行程序,输出结果为:
运行程序,显示效果为:
定义二维数组的形式如下:
数据类型 数组名[常量表达式1][常量表达式2];其中,“常量表达式1”定义了二维数组的行数,“常量表达式2”定义了二维数组的列数。
不管是行下标还是列下标,其索引都是从 0 开始的。因此,一个 m 行 n 列的二维数组 array[m][n],其行下标取值范围为 0~m−1,列下标取值范围为 0~m−1,最大下标元素是 array[m−1][n−1]。
例如,定义一个 3 行 4 列的整型数组,代码如下:
- int array[3][4];
array[0][0]、array[0][1]、array[0][2]、array[0][3]
array[1][0]、array[1][1]、array[1][2]、array[1][3]
array[2][0]、array[2][1]、array[2][2]和array[2][3]
C语言二维数组的引用
二维数组元素的引用形式为“数组名[下标][下标]”。例如,array[1][2] 表示对 array 数组的第 2 行第 3 个元素进行引用。和一维数组一样,二维数组也要注意下标越界的问题。例如:
- int array[2][4];
- ...
- array[2][4]=9; //错误,下标越界!
C语言二维数组的初始化
二维数组赋初值,有以下 4 种情况。1) 将所有数据写在一个大括号内,按照数组元素排列顺序对元素赋值。例如:
- int array[2][2] = {1,2,3,4};
2) 为所有元素赋初值时,可以省略行下标,但不能省略列下标。例如:
- int array[][3] = {1,2,3,4,5,6};
3) 分行给数组元素赋值。例如:
- int a[2][3] = {{1,2,3},{4,5,6}};
- int a[2][3] = {{1,2},{4,5}};
- a[0][0] 的值是 1;
- a[0][1] 的值是 2;
- a[0][2] 的值是 0;
- a[1][0] 的值是 4;
- a[1][1] 的值是 5;
- a[1][2] 的值是 0。
4) 直接对数组元素赋值。例如:
- int a[2][3];
- a[0][0] = 1;
- a[0][1] = 2;
【实例】一个 3×3 的网格,将 1~9 的数字放入方格中(矩阵中心元素为 5),使得每行、每列以及每条对角线上的 3 个数相加都相同。通过键盘为二维数组元素赋值,并显示二维数组。
- #include<stdio.h>
- int main()
- {
- int a[3][3]; /*定义二维数组*/
- int i,j; /*定义循环控制变量*/
- for(i=0;i<3;i++) /*先行后列,依次输入数据,为数组元素赋值*/
- {
- for(j=0;j<3;j++)
- {
- printf("a[%d][%d]=",i,j);
- scanf("%d",&a[i][j]);
- }
- }
- printf("输出二维数组:\n"); /*信息提示*/
- for(i=0;i<3;i++) /*先行后列,循环输出所有数组元素的值*/
- {
- for(j=0;j<3;j++)
- {
- printf("%d\t",a[i][j]); /*使用制表符控制间距,可排列更整齐*/
- }
- printf("\n"); /*使数组元素分行显示*/
- }
- return 0;
- }
- 给数组赋值时,使用了 for 循环嵌套,第一层循环行,第二层循环列,用 printf() 函数输出元素名,用 scanf() 函数输入数据,赋给对应的数组元素。
- 输出数组时,也使用了 for 循环嵌套,第一层循环行,第二层循环列,用 printf() 函数逐行输出数组元素。为了使输出的数据更整齐,使用制表符“\t”来控制间距。
运行程序,输出结果为:
a[0][0]=2 a[0][1]=7 a[0][2]=6 a[1][0]=9 a[1][1]=5 a[1][2]=1 a[2][0]=4 a[2][1]=3 a[2][2]=8输出二维数组:
2 7 6
9 5 1
4 3 8
C语言二维数组的应用
【实例】本实例中,把二维数组中各行的元素换成列元素,各列的元素换成行元素,生成一个新的二维数组。代码如下:
- #include<stdio.h>
- int main()
- {
- int a[2][3],b[3][2]; /*定义两个数组*/
- int i,j; /*定义循环控制变量*/
- for(i=0;i<2;i++) /*先行后列,输入数据,为数组元素赋值*/
- {
- for(j=0;j<3;j++)
- {
- printf("a[%d][%d]=",i,j);
- scanf("%d",&a[i][j]);
- }
- }
- printf("输出二维数组:\n"); /*信息提示*/
- for(i=0;i<2;i++) /*先行后列,循环输出二维数组 a 中的元素*/
- {
- for(j=0;j<3;j++)
- {
- printf("%d\t",a[i][j]);
- }
- printf("\n"); /*使数组元素分行显示*/
- }
- for(i=0;i<2;i++) /*将数组 a 转置后存入数组 b 中*/
- {
- for(j=0;j<3;j++)
- {
- b[j][i] = a[i][j]; /*通过行列互换,b 为 a 的转置数组*/
- }
- }
- printf("输出转换后的二维数组:\n");
- for(i=0;i<3;i++) /*先行后列,循环输出转置数组 b 中的元素*/
- {
- for(j=0;j<2;j++)
- {
- printf("%d\t",b[i][j]);
- }
- printf("\n"); /*使数组元素分行显示*/
- }
- return 0;
- }
- 利用双重 for 循环为 2 行 3 列的数组赋值,然后分行显示其元素。
- 通过一个双重 for 循环,将二维数组 a 中的元素赋值到转置后的二维数组 b 中。
- 通过循环控制,将转置后的二维数组 b 中的元素输出。
运行程序,显示效果为:
a[0][0]=12 a[0][1]=34 a[0][2]=25 a[1][0]=78 a[1][1]=65 a[1][2]=95 输出二维数组: 12 34 25 78 65 95 输出转换后的二维数组: 12 78 34 65 25 95