1

我有一个数组int b[MAXN][MAXN];

当我使用时int a[][MAXN] = b;(我知道int (*a)[MAXN]没关系)它给了我一个错误。

但是,如果我有一个函数,void f(int a[][MAXN]) 当我调用f(b); 它时它会起作用!

有人可以告诉我为什么吗?

4

2 回答 2

1

声明函数参数时,T[]与 相同,即将参数T*声明为指针。因此,void f(int a[][MAXN])只需将参数声明a为指向 intsize 数组的指针MAXN

对于其他类型的变量,它是不一样的。也就是说,当您编写 时int a[][MAXN] = b,它声明a为一个或多个数组,而不是指向数组的指针。这就是为什么这不起作用(因为你不能让数组“指向”其他类似的数组)。

请注意,这并不特定于数组数组。比较的话也是一样void f(int a[])int a[] = b。在前一种情况下,参数a只是一个int指针(就像你写过一样int *a),而在后一种情况下,参数a将是一个数组,你会因为与上面相同的原因得到一个错误。

于 2013-05-13T13:40:09.817 回答
0

您不能像这样用另一个初始化[在声明中]任何数组变量:

int a[1] = {};
int b[] = a;

这不是衰减到指针的情况。您似乎想声明一个新数组,它将是第一个数组的副本。当像您展示的那样将数组作为函数参数传递时,它们会衰减为指针,并且您不会创建新数组。

相反,如果您想要参考,您可以这样做:

int a[1] = {};

int (&b)[1] = a;  // first reference
auto &c = a;      // second rerefence

如果要复制,请复制:

int a[1] = { 42 };

int b[1];
decltype(a) c;

std::copy(std::begin(a), std::end(a), b);
std::copy(std::begin(a), std::end(a), c);
于 2013-05-13T13:39:31.713 回答