在这个例子中:
int a[2][2]={{1,2},{3,4}};
int *p=a[0];
cout<<p;
cout<<&a[0][0];
两者都提供相同的输出。 那么为什么我不能像这样调用函数(说好玩)并遍历数组:
fun(a[0]);
fun(int *p)
{
cout<<p[1][1];
}
答案 0 :(得分: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]
}
答案 1 :(得分:2)
回答你的问题: 当你写:
p = a[0];
a[0]
(现在是第0个元素到1D数组)实际上衰减到指针p
。所以两者都不是完全相同的类型,尽管它们似乎是。当你写:
fun(a[0]);
您实际上正在传递0
数组的元素,该元素现在是一维数组。所以你可以通过以下任何一种方式接收:
fun(int *p); // decay to pointer to 1D array
fun(int (&a)[2]); // receive array by reference
在fun()
现在都有1D数组的情况下。
为了简单起见,将引用传递给数组:
void fun(int (&p)[2][2])
{
cout<<p[1][1]; // ok !
}
用法:
fun(a); // not a[0]
答案 2 :(得分:0)
你不能cout<<p[1][1];
,因为p
是int *
- 一维数组。