如果`new int` 返回一个`int*`,那么为什么`new int[n]` 不返回一个`int**`?

Cam*_*ler 2 c++ free pointers memory-management heap-memory

我很疑惑怎么都new intnew int[n]返回int*。为什么后者不返回一个int**

以下是一些上下文:请参阅dataGoodrich、Tamassia 和 Mount 的第二版中的一个片段中的以下变量。C++ 教科书中的数据结构和算法:

class Vect {
   public:
      Vect(int n);
       ~Vect();
      // ... other public members omitted
   private:
      int* data;
      int size;
};
    
Vect::Vect(int n) {
    size = n;
    data = new int[n];
}
    
Vect::~Vect() {
    delete [] data;
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*nar 5

(答案包含为了解释而进行的简化)

在 C 中,int**如果我没记错的话,指向 int 数组的指针的类型是 。

你误会了。在 C 中,它也是int*.

当您声明: 时int foo[] = { 1, 2, 3 },数组的名称 ( foo) 可以被视为指向其第一个元素 ( 1) 的指针。指向的intint*

另外,为什么我们调用delete[]而不是delete, 来删除int*(数据)?

delete删除单个对象。delete []删除动态数组。

  • 我认为记住有时“int*”只是一个指向 int 的指针是有用的,但它也可以解释为 int 数组。这就是为什么如果您提前知道数组的大小,则应该考虑使用“std::array”;如果需要动态分配/调整数组大小,则应该考虑使用“std::vector” 。您还可以获得跟踪数组大小并使用基于范围的 for 循环(在其他语言中称为 foreach 循环)迭代数组中的项目的额外好处。 (2认同)