将2D数组传递给函数作为整数数组的指针

时间:2019-06-11 15:41:09

标签: c++

以下代码有效,但是可以吗?

#include <iostream>

using namespace std;

void display(int (*A)[3], int m, int n)
{
        for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                        cout << A[i][j] << endl;
}

int main()
{
        int arr[][3] = {{1,2,3},{4,5,6}};
        display(arr,2,3);
}

由于A是一个指向大小为3的整数数组的指针,实际上我们不是仅指第一行吗?之所以有效,是因为这6个元素位于连续的位置,因此我们从第一个元素的地址开始遍历6次。我的理解正确吗?

4 个答案:

答案 0 :(得分:1)

是的,很好。与任何指针算法一样,您正在使用指向第一个对象的指针。 int[2][3]数组的第一个对象的类型为int[3],指向该对象的指针的类型为int(*)[3],即 array指针

您的代码完全等同于void display(int A[2][3], int m, int n)。在这种情况下,编译器会默默地将参数调整为指向“行之间”第一个对象的指针,因此最终得到的代码完全相同。虽然我的版本是首选,因为它更具可读性。

关于为什么可以使用A[i][j]的原因,可以将A[i]视为对sizeof(int[3])对象的指针算法。


C也将允许您执行void display(int m, int n, int A[m][n]),但这在C ++中是不可能的。

答案 1 :(得分:0)

您传递此数组的方式是正确的。

每次将数组传递给函数时,实际上是在传递指向第一个元素的指针。在这种情况下,数组的每个元素都是一个int[3]

出于相同的原因,如果将arr定义为int arr[2],则可以将其传递给期望int *的函数。

答案 2 :(得分:0)

  

由于A是一个指向大小为3的整数数组的指针,实际上我们不是仅指第一行吗?

是的,A指向2D数组的第一个元素(索引为零)。 2D数组中总共有两个元素。它们中的每一个都是一维数组,即二维数组的一行。 A[i]是第i行(从零开始)。 A[i][j]是第j行的第i个元素。

答案 3 :(得分:0)

代码很好。数组衰减到指向第一个元素的指针。这意味着二维数组将衰减为指向数组的指针。

也就是说,您还可以通过引用传递数组,这可以使您不必指定数组大小,因为可以为您推断出数组大小。将功能更改为

template <size_t rows, size_t cols>
void display(const int (&A)[rows][cols])
{
    for(int i=0;i<rows;i++)
            for(int j=0;j<cols;j++)
                    cout << A[i][j] << endl;
}

允许您将其命名为display(arr);,而不是display(arr,2,3);