我有一个数组int b[MAXN][MAXN];
当我使用时int a[][MAXN] = b;
(我知道int (*a)[MAXN]
没关系)它给了我一个错误。
但是,如果我有一个函数,void f(int a[][MAXN])
当我调用f(b);
它时它会起作用!
有人可以告诉我为什么吗?
我有一个数组int b[MAXN][MAXN];
当我使用时int a[][MAXN] = b;
(我知道int (*a)[MAXN]
没关系)它给了我一个错误。
但是,如果我有一个函数,void f(int a[][MAXN])
当我调用f(b);
它时它会起作用!
有人可以告诉我为什么吗?
声明函数参数时,T[]
与 相同,即将参数T*
声明为指针。因此,void f(int a[][MAXN])
只需将参数声明a
为指向 int
size 数组的指针MAXN
。
对于其他类型的变量,它是不一样的。也就是说,当您编写 时int a[][MAXN] = b
,它声明a
为一个或多个数组,而不是指向数组的指针。这就是为什么这不起作用(因为你不能让数组“指向”其他类似的数组)。
请注意,这并不特定于数组数组。比较的话也是一样void f(int a[])
的int a[] = b
。在前一种情况下,参数a
只是一个int
指针(就像你写过一样int *a
),而在后一种情况下,参数a
将是一个数组,你会因为与上面相同的原因得到一个错误。
您不能像这样用另一个初始化[在声明中]任何数组变量:
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);