c++ - C++ 中 int* 和 int[] 的区别

标签 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
}

A = 0 失败但 B = 0 成功。有什么收获? A到底是什么?常量指针?那我该如何初始化呢?

最佳答案

问题“int* 和 int[] 有什么区别?”是一个比大多数人会想到的更简单的问题:它取决于它的使用位置。

在声明中,如extern int a[]; 表示某处有一个名为a 的数组,其大小在这里未知。在具有聚合初始化的定义中,如 int a[] = { 1, 2, 3 }; 它表示一个大小的数组,作为程序员,我不想计算,而你,编译器, 必须从初始化开始解释。在没有初始化的定义中,这是一个错误,因为您不能定义一个未知大小的数组。在函数声明(和/或)定义中,它完全等同于 int*,该语言指定在处理函数参数的类型时,将数组转换为指向所包含类型的指针。

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

关于c++ - C++ 中 int* 和 int[] 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4851234/

相关文章:

c++ - 如何检查 float 的依赖关系

c++ - 使用 map 为类创建迭代器

c++ - Typedef 泛化

C++ 将 Lambda 与 vector 中的函数指针区分开来

c++ - 为什么我的 Qt 小部件的焦点被改变了?

C++ 无法为高阶函数派生模板参数

c++ - std::string 到 float (通过 std::stof)精度

c++ - 从函数返回值 : reference vs struct

c++ - 在不使用第三个数组的情况下交换两个变量的值

c++ - 正确声明智能指针