MST
星途 面试题库

面试题:C语言多维数组指针在函数参数传递中的应用

编写一个函数 `void printArray(int (*ptr)[4], int rows)`,该函数接受一个指向二维数组的指针(其中第二维大小为4)和数组的行数作为参数,函数功能是打印出这个二维数组的所有元素。调用这个函数来打印 `int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};`。说明在函数参数传递中,多维数组指针与普通数组名作为参数有何不同及原因。
50.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 函数定义
void printArray(int (*ptr)[4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    printArray(arr, 3);
    return 0;
}

多维数组指针与普通数组名作为参数的不同及原因

  1. 多维数组指针作为参数
    • 不同点:在函数定义 void printArray(int (*ptr)[4], int rows) 中,ptr 是一个指向包含4个 int 元素的数组的指针。这种方式明确指定了数组第二维的大小,在函数内部可以像使用二维数组一样通过 ptr[i][j] 来访问元素。
    • 原因:编译器需要知道数组第二维的大小,以便在内存中正确地计算偏移量来访问每个元素。因为二维数组在内存中是按行顺序存储的,知道第二维大小才能准确地定位到每一个元素。
  2. 普通数组名作为参数
    • 不同点:当普通数组名作为参数传递时,在函数调用处,数组名会自动退化为指向数组首元素的指针。例如 int arr[3][4],传递给函数时,arr 变成了 int (*)[4] 类型的指针。与多维数组指针不同的是,数组名在函数内部不能像在定义处那样通过 sizeof 操作符获取数组的总大小,因为它已经退化为指针。
    • 原因:C语言的设计理念中,数组名在大多数表达式中会被隐式转换为指针,以方便函数参数传递,这样可以减少内存开销(因为只传递指针而不是整个数组的副本)。但同时也丢失了数组的一些元信息,比如数组的大小。