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

sr4lhrrt  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(215)

我很困惑为什么new intnew int[n]都返回int*,为什么后者不返回int**
以下是一些背景:参考古德里奇、Tamassia和Mount的第2版《C++中的数据结构和算法》教科书中的一个片段中的变量data

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;
}
xesrikrc

xesrikrc1#

(答案包含简化,以便于解释)
在C语言中,如果我没记错的话,指向int数组的指针应该是int**类型。
你弄错了,在C语言中,它也是int*,更准确地说:int (*)[]
当您声明:int foo[] = { 1, 2, 3 },数组的名称(foo)在很多情况下可以有效地**被当作指向其第一个元素(1)的指针。指向int的指针是int*
另外,为什么要调用delete[]而不是delete来删除int*(数据)?
delete删除单个对象。delete []删除动态数组。

lc8prwob

lc8prwob2#

new int[n]无法返回int**类型的结果,因为int**值必须指向int*类型的 * object *(指针对象)。
new int[n]n对象数组分配内存,每个对象的类型为int。它不创建指针对象。
它返回的int*值指向分配数组的初始(第0个)元素。数组的其他元素可以通过指针算法访问。
它 * 可以 * 被定义为产生int (*)[n]类型的结果,这是一个指向nint元素数组的指针,除了(a)C不允许数组具有非常数边界,(b)即使对于int (*)[4]这样的东西,int*也不太方便。
C
和它的祖先语言C一样,把数组当作二等公民。数组表达式在大多数情况下(但不是所有情况下)被"转换"(在编译时调整)为指针表达式,指向数组对象的初始元素,并且数组元素使用指针算法访问。(索引操作符a[i]*(a+i)的语法糖)。
是的,这一切都可能令人困惑和违反直觉。
推荐阅读:comp.lang.c FAQ的第6节(大部分内容同时适用于C和C++)。

相关问题