传递二维数组作为参数

4
在这个例子中:
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];
}

这不是完全重复,但您应该查看这个优秀的FAQ条目:https://dev59.com/8m445IYBdhLWcg3wia2V - Alok Save
3个回答

3
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]
}

非常好。为了明确,这个函数fun访问原始2维数组的1维切片。我不太明白这是否是OP想要的,所以我认为最好明确说明一下。 - Kerrek SB

2
回答您的问题: 当您写下以下内容时:
p = a[0];

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

fun(a[0]);

您实际上是传递了数组的第0个元素,现在它是一个一维数组。因此,您可以通过以下任一方式接收:

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

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

为了使事情更简单,传递对数组的引用:

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

使用方法:

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

不,这种情况下他不能将a[0]传递给fun,尽管这似乎是他想要的。 - Armen Tsirunyan

0

你不能使用 cout<<p[1][1];,因为 p 是一个一维数组 int *


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接