📜  C中的二维数组(1)

📅  最后修改于: 2023-12-03 15:14:25.166000             🧑  作者: Mango

C中的二维数组

在C语言中,二维数组是一种常见的数据结构,它可以用来存储矩阵、图形等二维结构的数据。一个二维数组也可以看做一个由多个一维数组组成的数组。每个一维数组代表着二维数组中的一行,每个元素可以通过两个下标来访问。

声明和初始化二维数组

声明二维数组的语法如下:

type arrayName[rowSize][colSize];

其中,type是二维数组中每个元素的类型,rowSizecolSize分别代表二维数组的行数和列数。比如,下面是一个声明一个3x4的二维数组的例子:

int matrix[3][4];

这个二维数组可以用来存储3行4列的整数矩阵。

二维数组的初始化可以通过显式地给出每个元素的值实现,或者使用类似C语言中一维数组的初始化语法。下面是一个使用显式初始化的例子:

int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

这个例子声明了一个3x4的整数矩阵,并通过显式初始化给每个元素赋值。注意每行末尾不需要加逗号。

访问二维数组元素

要访问二维数组中的某个元素,需要使用两个下标来确切地定位到该元素的位置。下标的范围是从0到行数-1和列数-1。例如,要访问上面初始化后的矩阵中第二行第三列的元素,可以这样写:

int value = matrix[1][2]; // value的值为7
处理二维数组

使用二维数组时经常需要对整个数组或部分数组进行遍历和操作。以下是两个常见的遍历二维数组的方法:

方法1:使用双重循环

双重循环是遍历二维数组最常见的方法,其核心思想是使用外层循环遍历行,内层循环遍历列。以下代码展示了如何使用双重循环遍历一个3x4的矩阵:

int i, j;
for (i = 0; i < 3; i++) {
    for (j = 0; j < 4; j++) {
        printf("%d ", matrix[i][j]);
    }
    printf("\n");
}
方法2:使用指针

指针是C语言的重要特性之一,也可以用来遍历二维数组。使用指针的方法相对灵活,也比较高效。以下是一个遍历一个3x4的矩阵的例子:

int* ptr = &matrix[0][0];
int i, j;
for (i = 0; i < 3; i++) {
    for (j = 0; j < 4; j++) {
        printf("%d ", *(ptr + i * 4 + j));
    }
    printf("\n");
}

注意,这个方法中,指针ptr指向了二维数组中的第一个元素,即matrix[0][0]。在循环中,每次访问时通过指针加上偏移量来访问指定元素。

处理不规则二维数组

除了规则的二维数组(即每行元素个数相同的数组)外,C语言还支持不规则的二维数组,即每行元素个数不同的数组。不规则的数组不能用双重循环访问,因为不同行的元素个数不同。处理不规则数组的常用方法是使用“指针数组”,即用一个数组来存储多个指向不同行的指针。以下是一个声明和初始化不规则二维数组、以及遍历它的例子:

int arr[3][];
arr[0] = (int[]){1, 2};
arr[1] = (int[]){3, 4, 5};
arr[2] = (int[]){6, 7, 8, 9};

int i, j;
for (i = 0; i < 3; i++) {
    int* row = arr[i];
    int size = sizeof(arr[i]) / sizeof(int);
    for (j = 0; j < size; j++) {
        printf("%d ", *(row + j));
    }
    printf("\n");
}

在这个例子中,arr是一个三行不规则数组,其中每行的元素个数不同。为了遍历这个数组,我们定义了一个int*类型的指针row,用它来遍历当前行。每行遍历时,根据元素个数计算出当前行的大小,然后使用指针遍历每个元素。