C 语言中,处理二维数组时,了解指针在多维数组中的使用非常重要。可以通过不同的方式声明二维数组,并使用指针来操作或访问数组元素。

1、使用指向二维数组的指针

C 语言中,二维数组是按行优先顺序存储的,也就是一个行的所有元素在内存中是连续存储的。可以将二维数组视为指向数组的指针。

#include <stdio.h>

int main() {
    // 声明并初始化一个二维数组
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    // 声明一个指向二维数组的指针
    int (*ptr)[3][4];

    // 将指针指向 arr 数组
    ptr = &arr;

    // 通过指针访问数组元素
    printf("arr[0][0] = %d\n", (*ptr)[0][0]);  // 访问第一行第一列
    printf("arr[2][3] = %d\n", (*ptr)[2][3]);  // 访问第三行第四列

    // 使用循环通过指针遍历数组
    printf("全数组内容:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", (*ptr)[i][j]);
        }
        printf("\n");
    }

    return 0;
}

2、通过指针访问数组元素

在声明了指针后,可以使用指针算术来访问数组中的元素。

#include <stdio.h>

int main() {
    // 声明一个二维数组
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 声明一个指向二维数组的指针
    int (*ptr)[3] = arr;

    // 使用指针算术访问数组中的元素
    printf("%d\n", ptr[0][1]);  // 访问第一行第二列的元素 (2)
    printf("%d\n", ptr[1][2]);  // 访问第二行第三列的元素 (6)
    printf("%d\n", ptr[2][0]);  // 访问第三行第一列的元素 (7)

    return 0;
}

3、动态分配二维数组内存

使用 malloc 动态分配二维数组。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 3, cols = 4;

    // 动态分配二维数组的内存
    int **arr = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        arr[i] = (int *)malloc(cols * sizeof(int));
    }

    // 赋值
    arr[0][0] = 1;
    arr[1][1] = 2;
    arr[2][2] = 3;

    // 访问值
    printf("%d\n", arr[0][0]);  // 访问第一行第一列的元素

    // 释放动态分配的内存
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}