这些数组在c++中是什么意思?

What do each of these arrays mean in C++?

本文关键字:是什么 意思 c++ 数组      更新时间:2023-10-16

我收到的c++讲座幻灯片只是提到了这些,而没有解释它们的含义和它们的区别:

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

这些分别是什么意思?我试着用其中的一些运行一个程序,但我得到错误,因为我不知道在初始化列表中放入什么。

  • int (*arr)[] = { ... };

    这根本不是一个数组。这是一个指针,指向一个未知大小的数组。注意,这是一个标量类型。它只是一个数据指针,与其他数据指针没有本质上的区别。这意味着使用{ ... }初始化器的唯一方法是在{ ... }内部指定一个适当类型的单个值。例如

    int (*arr)[] = { nullptr };
    

    相同
    int (*arr)[] = nullptr;
    
  • int *(arr[]) = { ... };

    这确实是一个数组。同样的东西也可以表示为

    int *arr[] = { ... };
    

    这是一个int *指针数组。它的大小取决于{ ... }中提供了多少初始化式。例如

    int *arr[] = { nullptr, &some_int, &some_other_int };
    

    声明arrint *类型的3个指针数组。

  • int (&arr)[] = { ... };

    这本身不是一个数组。这是对未知大小数组的引用。同样,在这种情况下,唯一合法的{ ... }初始化式只能是{ ... }中的一个int []类型的左值。如果数组被声明为const,您可以使用以下语法将其附加到int的临时数组,例如

    const int (&arr)[] = { 1, 2, 3 };
    

    但是没有const这是不可能的。(虽然我对const的合法性也有怀疑。

  • int &(arr[]) = { ... };

    试图声明一个引用数组。不允许的。

你需要使用顺时针/螺旋规则。

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

最后一个是非法的:为什么引用数组是非法的?