MST

星途 面试题库

面试题:C语言多维数组名在函数传递中的特性

编写一个函数,接收一个二维数组作为参数,并在函数内部能够正确访问数组中的每一个元素。函数原型为 `void func(int arr[][4], int rows);`,解释在函数参数列表中为何第二维的大小必须指定,同时说明在函数内部如何通过数组名特性来实现元素的正确访问。
42.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 为何第二维大小必须指定

    • 在C语言中,二维数组在内存中是按行存储的。当把二维数组作为参数传递给函数时,函数需要知道每行的大小(即第二维的大小),以便正确计算每个元素在内存中的偏移量。如果不指定第二维大小,编译器无法确定每行的边界,也就无法正确访问数组元素。例如,假设有一个二维数组int arr[3][4],在内存中它是连续存储的,若不指定第二维大小为4,编译器不知道从一个元素跳到下一行的下一个元素该跳过多少字节。
  2. 在函数内部通过数组名特性实现元素正确访问: 在C语言中,数组名在大多数情况下会被转换为指向数组首元素的指针。对于二维数组int arr[][4]arr实际上是一个指向int[4]类型数组的指针。在函数func内部,可以通过以下方式访问元素:

void func(int arr[][4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            // 访问元素arr[i][j]
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

这里,arr[i][j]本质上是*(*(arr + i)+j)arr + i指向第i行的起始地址(因为arr是指向int[4]类型数组的指针),*(arr + i)获取第i行数组的首地址(类型为int*),*(arr + i)+j指向第i行第j列元素的地址,*(*(arr + i)+j)就是获取该元素的值。