我收到了C ++的演讲幻灯片,仅提及这些幻灯片而没有解释它们的含义以及它们的区别:
int (*arr)[]={...};
int *(arr[])={...};
int (&arr)[]={...};
int &(arr[])={...}; // not allowed?
这些意味着什么?我尝试使用其中一些程序运行程序,但我收到错误,因为我不知道在初始化列表中放入什么。
答案 0 :(得分:6)
int (*arr)[] = { ... };
这根本不是一个数组。这是一个未知大小的数组的指针。请注意,这是一个标量类型。它只是一个数据指针,与任何其他数据指针在本质上没有区别。这意味着使用{ ... }
初始值设定项的唯一方法是在{ ... }
内指定正确类型的单个值。 E.g。
int (*arr)[] = { nullptr };
与
相同int (*arr)[] = nullptr;
int *(arr[]) = { ... };
这确实是一个数组。同样的事情可以表示为
int *arr[] = { ... };
这是一个int *
指针数组。它的大小取决于{ ... }
中提供的初始化程序数。 E.g。
int *arr[] = { nullptr, &some_int, &some_other_int };
将arr
声明为3个int *
类型指针的数组。
int (&arr)[] = { ... };
这本身不是数组。这是一个未知大小的数组的引用。同样,在这种情况下,唯一合法的{ ... }
初始化程序只是int []
中{ ... }
类型的一个左值。如果数组声明为const
,则您可以使用此语法将其附加到int
的临时数组,例如
const int (&arr)[] = { 1, 2, 3 };
但没有const
则不可能。 (我对const
的合法性表示怀疑.GCC接受了。)
int &(arr[]) = { ... };
这是尝试声明引用数组。不允许。
答案 1 :(得分:2)
您需要使用Clockwise/Spiral Rule。
int (*arr)[]={...}; // pointer to array of int
int *(arr[])={...}; // array of int pointers
int (&arr)[]={...}; // a reference to an array of int
int &(arr[])={...}; // an array of int references