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

Leo*_*ang -2 c++

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

int (*arr)[]={...};
int *(arr[])={...};
int (&arr)[]={...};
int &(arr[])={...}; // not allowed?
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 6

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

    这根本不是一个数组.这是指向未知大小的数组的指针.请注意,这是一个标量类型.它只是一个数据指针,与任何其他数据指针在本质上没有区别.这意味着使用{ ... }初始化程序的唯一方法是在其中指定正确类型的单个值{ ... }.例如

    int (*arr)[] = { nullptr };
    
    Run Code Online (Sandbox Code Playgroud)

    这是一样的

    int (*arr)[] = nullptr;
    
    Run Code Online (Sandbox Code Playgroud)
  • int *(arr[]) = { ... };

    这确实是一个阵列.同样的事情可以表达为

    int *arr[] = { ... };
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个int *指针数组.它的大小取决于提供的初始化程序数{ ... }.例如

    int *arr[] = { nullptr, &some_int, &some_other_int };
    
    Run Code Online (Sandbox Code Playgroud)

    声明arr为3个类型的指针数组int *.

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

    这本身不是数组.这是对未知大小的数组的引用.同样,{ ... }在这种情况下,唯一合法的初始值设定项只是int []内部类型的一个左值{ ... }.如果声明了数组,则const可以int使用此语法将其附加到s 的临时数组,例如

    const int (&arr)[] = { 1, 2, 3 };
    
    Run Code Online (Sandbox Code Playgroud)

    但没有const它是不可能的.(const尽管如此,我对这种合法性表示怀疑.GCC接受了它.)

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

    这是尝试声明一个引用数组.不允许.