将2D数组作为参数传递

Passing 2D array as argument

本文关键字:参数传递 数组 2D      更新时间:2023-10-16

在这个例子中:

int a[2][2]={{1,2},{3,4}};
int *p=a[0];
cout<<p;
cout<<&a[0][0];

都给出相同的输出。那么为什么我不能像这样调用函数(比如fun)并循环遍历数组:

fun(a[0]);
fun(int *p)
{
cout<<p[1][1];
}
fun(a[0]); //this looks OK
void fun(int *p) // this is OK if you add return type'
^^^^
{
   cout<<p[1][1]; //NOT OK!  You can't have 2 indices on an `int*`
   cout << p[1]; // OK, will print a[0][1]
}

回答你的问题:当你写:

p = a[0];

a[0](现在是1D数组的第0个元素)实际上衰变成了一个指针p。所以两者并不是完全相同的类型,尽管它们看起来是。当你写:

fun(a[0]);

你实际上是传递给0数组的元素,现在是一个1D数组。因此,您可以通过以下任何一种方式接收:

fun(int *p); // decay to pointer to 1D array
fun(int (&a)[2]); // receive array by reference

在这两种情况下,fun()现在有一个1D数组。

为了使事情更简单,将引用传递给array:

void fun(int (&p)[2][2])
{
  cout<<p[1][1];  // ok !
}

用法:

fun(a); // not a[0]

你不能cout<<p[1][1];,因为pint *——一个一维数组。