首页 > 编程笔记 > C语言笔记 阅读:41

C语言二维数组详解(非常详细)

C语言中的二维数组可以看作是特殊的一维数组,其各个元素仍然是一个数组。

定义二维数组的形式如下:
数据类型 数组名[常量表达式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[3][4] 共包含 12 个数组元素(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[3][4] 在内存中先按行顺次存放,依次为 array[0] 行、array[1] 行和 array[2] 行,每行有 4 个元素,也依次存放。

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};
如果大括号内的数据少于数组元素的个数,则系统会默认后面未被赋值的元素值为 0。

2) 为所有元素赋初值时,可以省略行下标,但不能省略列下标。例如:
int array[][3] = {1,2,3,4,5,6};
系统会根据数据的个数进行分配,一共有 6 个数据,而数组分为 3 列,因此数组有 2 行。

3) 分行给数组元素赋值。例如:
int a[2][3] = {{1,2,3},{4,5,6}};
在分行赋值时,可以只对部分元素赋值。例如,下面的代码中:
int a[2][3] = {{1,2},{4,5}};

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;
}
程序先依次输入相应的数组元素值,然后将这个 3 行 3 列的数组输出:
运行程序,输出结果为:
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;
}

运行程序,显示效果为:
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

相关文章