MST

星途 面试题库

面试题:C语言多维数组指针作为函数参数

编写一个函数`void sumRows(int (*matrix)[4], int rows);`,该函数用于计算一个`rows`行4列的二维数组每一行元素的和,并将结果存储在一个一维数组中返回。请解释函数参数中`int (*matrix)[4]`这种指针形式的意义,以及函数中指针的使用方式和注意事项。
45.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 函数声明
void sumRows(int (*matrix)[4], int rows);

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

void sumRows(int (*matrix)[4], int rows) {
    int sums[rows];
    for (int i = 0; i < rows; i++) {
        sums[i] = 0;
        for (int j = 0; j < 4; j++) {
            sums[i] += *(*(matrix + i) + j);
        }
        printf("第 %d 行的和为: %d\n", i + 1, sums[i]);
    }
}

int (*matrix)[4]指针形式的意义

  • int (*matrix)[4] 是一个指向含有4个 int 类型元素的数组的指针。
  • 在C语言中,二维数组名本质上是一个指向其首行的指针。这里的 matrix 指针就用来接收这个二维数组首行的地址。由于每一行有4个 int 类型元素,所以指针 matrix 指向的对象是一个包含4个 int 类型元素的数组。

函数中指针的使用方式

  • 通过 *(matrix + i) 来访问第 i 行的首地址,matrix 本身是指向首行的指针,matrix + i 就是指向第 i 行的指针,解引用 *(matrix + i) 得到第 i 行的首地址。
  • 再通过 *(*(matrix + i) + j) 来访问第 i 行第 j 列的元素,*(matrix + i) 得到第 i 行首地址,*(matrix + i) + j 则是第 i 行第 j 列元素的地址,再解引用一次就得到该元素的值。

注意事项

  • 数组访问越界问题:必须确保 i 的范围是 0rows - 1j 的范围是 03,否则会导致未定义行为。
  • 指针类型一致性:函数参数声明的指针类型必须与传入的实际参数类型一致,这里传入的二维数组每一行必须是4个 int 类型元素,否则会出现类型不匹配的问题。
  • 内存管理:在函数内部定义的 sums 数组是局部数组,其生命周期仅限于函数内部。如果需要在函数外部使用 sums 数组的内容,可以考虑通过动态内存分配(如 malloc)并返回指针,或者将 sums 数组作为函数参数传入。