MST

星途 面试题库

面试题:C语言中多维数组指针的基础运用

假设有一个二维数组 `int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};`,请编写代码通过指针来访问并打印出数组中的所有元素。解释在这个过程中指针是如何与多维数组关联的。
12.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

int main() {
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    int (*ptr)[4] = arr; // 定义一个指向包含4个int类型元素的数组的指针,并初始化为数组首地址

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", *(*(ptr + i) + j)); // 通过指针访问并打印元素
        }
        printf("\n");
    }

    return 0;
}

指针与多维数组的关联解释

  1. 指针类型int (*ptr)[4] 定义了一个指针 ptr,它指向一个包含4个 int 类型元素的数组。因为 arr 是一个二维数组,其每一行可以看作是一个包含4个 int 类型元素的数组,所以 ptr 可以指向 arr 的每一行。
  2. 指针运算
    • ptr + i:由于 ptr 指向包含4个 int 类型元素的数组,ptr + i 会根据 i 的值移动指针,每次移动的距离是一行的大小(即4个 int 类型元素的大小),这样 ptr + i 就指向了 arr 的第 i 行。
    • *(ptr + i):对 ptr + i 进行解引用,得到第 i 行的首地址,此时它等价于 arr[i],类型为 int*
    • *(ptr + i) + j:在第 i 行的首地址基础上,加上 j,就指向了第 i 行第 j 列的元素。
    • *(*(ptr + i) + j):再次解引用,就得到了第 i 行第 j 列的具体元素值。