MST

星途 面试题库

面试题:C++多维数组传参及指针运算

给定一个二维整数数组`int arr[3][4]`,编写一个函数`void processArray(int (*ptr)[4], int rows)`,该函数接收二维数组的指针和行数作为参数。在函数中,使用指针操作将每一行的元素之和打印出来。请详细说明指针在二维数组传参和操作过程中的应用,以及与一维数组传参指针操作的异同点。
25.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

void processArray(int (*ptr)[4], int rows) {
    for (int i = 0; i < rows; ++i) {
        int sum = 0;
        for (int j = 0; j < 4; ++j) {
            sum += *(*(ptr + i) + j);
        }
        std::cout << "Sum of row " << i << " is: " << sum << std::endl;
    }
}

指针在二维数组传参和操作过程中的应用

  1. 传参
    • 在函数processArray中,参数int (*ptr)[4]是一个指向含有4个int元素的数组的指针。这里ptr指向二维数组的第一行,因为二维数组在内存中是按行存储的。rows参数表示二维数组的行数。
    • 当我们调用processArray(arr, 3)时,arr作为二维数组名,它会自动转换为指向其第一行的指针,也就是&arr[0],类型为int (*)[4],这与函数参数ptr的类型相匹配。
  2. 操作
    • *(ptr + i)指向二维数组的第i行。这是因为ptr是指向含有4个int元素的数组的指针,ptr + i会根据数组的存储方式,移动到第i个这样的数组(即第i行)。
    • *(*(ptr + i) + j)访问第i行第j列的元素。*(ptr + i)指向第i行,*(ptr + i) + j则指向该行的第j个元素(因为指针算术运算),再通过*取值得到实际元素。

与一维数组传参指针操作的异同点

  • 相同点
    • 传参:一维数组传参时,数组名也会自动转换为指针,例如void func(int *ptr),这里ptr指向数组的第一个元素。二维数组传参同样将数组名转换为指针,虽然指针类型不同,但都是通过指针传递数组首地址。
    • 指针运算:都可以通过指针进行算术运算来访问数组元素。在一维数组中*(ptr + i)访问第i个元素,二维数组中通过类似的指针运算*(*(ptr + i) + j)访问特定位置元素。
  • 不同点
    • 指针类型:一维数组传参指针类型是int *,指向单个int元素。而二维数组传参指针类型如int (*)[4],指向含有特定数量(这里是4个)int元素的数组。
    • 多层间接访问:二维数组操作需要两层间接访问(*(*(ptr + i) + j))来获取具体元素,因为它本质上是数组的数组;而一维数组只需要一层间接访问(*(ptr + i))。