【问题标题】:If `new int` returns an `int*`, then why doesn't `new int[n]` return an `int**`?如果`new int`返回一个`int*`,那么为什么`new int[n]`不返回一个`int**`呢?
【发布时间】:2020-10-31 19:46:27
【问题描述】:

我很困惑new intnew int[n] 如何返回int*。为什么后者不返回int**

这里有一些上下文:请参阅下面来自 Goodrich、Tamassia 和 Mount 的第二版的 sn-p 中的变量 data。 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;
}

【问题讨论】:

    标签: c++ pointers memory-management heap-memory free


    【解决方案1】:

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

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

    你错了。在 C 语言中,它也是 int*

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

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

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

    【讨论】:

    • 我认为记住有时int* 只是一个指向 int 的指针很有用,但它也可以解释为 int 数组。这就是为什么您应该考虑使用std::array(如果您提前知道数组的大小)或std::vector(如果您需要动态分配/调整数组大小)的原因。您还可以获得额外的好处,即跟踪数组的大小并使用基于范围的 for 循环(在其他语言中称为 foreach 循环)迭代数组中的项目。
    • 看,我得到了简化,int[n] 基本上是 int*,即使这是一个小谎言,但我们可以停止公然错误的“简化” " int** 是一个二维数组?这个网站上已经有足够多的关于人们尝试将int (*)[] 转换为int** 的问题。
    • @HTNW 好的,你是对的。这个可能有点过于简单化了。
    • @keith-thompson 没有人这么说
    • 但是在访问时,数组被转换为指向第一个元素的指针C++17 Standard - 7.2 Array-to-pointer conversion
    【解决方案2】:

    new int[n] 无法返回int** 类型的结果,因为int** 值必须指向int* 类型的对象(指针对象)。

    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++)。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2013-02-26
      • 2019-08-14
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多