C++中int*和int []之间的区别

EFr*_*eak 6 c++

上下文:C++考虑下面的示例

class TestClass
{
private:
    int A[];
    int *B;

public:
    TestClass();
};

TestClass::TestClass()
{
    A = 0; // Fails due to error: incompatible types in assignment of `int' to `int[0u]'
    B = 0; // Passes
}
Run Code Online (Sandbox Code Playgroud)

A = 0失败但B = 0成功.有什么收获?A究竟是什么?常量指针?我如何初始化呢?

Dav*_*eas 11

问题是"int*和int []之间有什么区别?" 这是一个不像大多数人想象的那么简单的问题:它取决于它的使用地点.

在一个声明中,就像extern int a[];它意味着某个地方有一个名为的数组a,其大小在这里是未知的.在使用聚合初始化的定义中,就像int a[] = { 1, 2, 3 };它意味着一个大小为I的数组,作为程序员,不想计算,并且编译器必须从初始化中解释.在没有初始化的定义中,这是一个错误,因为您无法定义未知大小的数组.在函数声明(和/或)定义中,它完全等效于int*,语言指定在处理函数的参数类型时,数组被转换为指向包含类型的指针.

在您的特定情况下,作为类成员的声明,int a[];是一个错误,因为您声明一个不完整类型的成员.如果你在那里添加一个大小,int a[10]那么它就变成了类型int和大小为10 的数组的声明,并且将int在类的每个对象中保留10个空格.而另一方面,int *b只会为类中的整数指针保留空间.


Naw*_*waz 5

它们之间的唯一区别是,int A[] 在一个类中它不会编译,也不应该编译!

Comeau C ++编译器给出此错误:

“ ComeauTest.c”,第4行:错误:   
不允许输入不完整的类型   
      int A [];
          ^ 

维基百科说,

Comeau C / C ++被认为是最符合标准的C ++编译器。

因此,我建议:即使编译器对其进行编译,也不要编写此类代码。

  • @EFreak:您使用任何选项吗?编译为`g ++ -pedantic filename.cpp` ..并告诉我结果。我很好奇 :-) (2认同)