这些数组在C ++中意味着什么?

时间:2015-08-06 21:53:15

标签: c++

我收到了C ++的演讲幻灯片,仅提及这些幻灯片而没有解释它们的含义以及它们的区别:

int (*arr)[]={...};
int *(arr[])={...};
int (&arr)[]={...};
int &(arr[])={...}; // not allowed?

这些意味着什么?我尝试使用其中一些程序运行程序,但我收到错误,因为我不知道在初始化列表中放入什么。

2 个答案:

答案 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

最后一个是非法的:Why arrays of references are illegal?