Z
ZHANK
数组与字符串

多维数组

二维数组、矩阵操作、内存布局(行优先)

多维数组

二维数组 = 数组的数组。C 中二维数组在内存中是行优先的——同一行的元素是连续的。

学完本章你将: 掌握二维数组声明/初始化、矩阵操作、内存布局。


二维数组声明

c
#include <stdio.h>

int main() {
    // 3 行 4 列的二维数组
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    };

    // 访问
    printf("%d\n", matrix[0][2]);  // 3
    printf("%d\n", matrix[2][3]);  // 12

    return 0;
}

遍历二维数组

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

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

内存布局 —— 行优先

c
// matrix[2][3] 在内存中的实际排列:
// [0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

// 可以当成一维数组访问
int *p = &matrix[0][0];
for (int i = 0; i < 2 * 3; i++) {
    printf("%d ", p[i]);  // 1 2 3 4 5 6
}

省略第一维长度

c
// 第一维可以省略,第二维不行
int matrix[][3] = {
    {1, 2, 3},
    {4, 5, 6},
};

// int matrix[][] = {...};     // ❌ 编译错误

💡 编译器需要知道除了第一维以外的所有维度大小,才能计算出每个元素的位置。


多维数组作为函数参数

c
// 必须指定除第一维以外的维度
void printMatrix(int m[][4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%2d ", m[i][j]);
        }
        printf("\n");
    }
}