以下代码有效,但是可以吗?
#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次。我的理解正确吗?
答案 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);
。