MST

星途 面试题库

面试题:C语言多维数组传递时的内存布局与指针运算

假设你有一个三维数组 `int arr[3][4][5]`,将其作为参数传递给一个函数 `void func(int (*)[4][5])`。请详细解释在函数内部如何通过指针运算访问 `arr[1][2][3]` 这个元素,并编写完整的代码示例。
49.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 指针运算解释

    • 函数 void func(int (*)[4][5]) 接受一个指向 int[4][5] 数组的指针。
    • 当三维数组 int arr[3][4][5] 传递给该函数时,指针实际上指向 arr 的第一个二维数组部分 arr[0]
    • 要访问 arr[1][2][3],首先要移动到 arr 的第二个二维数组部分,因为数组下标从0开始,所以移动一个 int[4][5] 大小的偏移,即 *(ptr + 1),这里 ptr 是函数参数中的指针。
    • 然后在这个二维数组 *(ptr + 1) 中,要移动到第三行(下标为2),即 *(*(ptr + 1)+2)
    • 最后在这一行中移动到第四个元素(下标为3),即 *(*(*(ptr + 1)+2)+3)
  2. 代码示例

#include <stdio.h>

void func(int (*ptr)[4][5]){
    int value = *(*(*(ptr + 1)+2)+3);
    printf("arr[1][2][3]的值为: %d\n", value);
}

int main() {
    int arr[3][4][5] = {0};
    // 为了演示,给arr[1][2][3]赋一个值
    arr[1][2][3]=10;
    func(arr);
    return 0;
}

上述代码中,func 函数通过指针运算获取并打印 arr[1][2][3] 的值。在 main 函数中,初始化 arr 并给 arr[1][2][3] 赋值为10,然后调用 func 函数。