【问题标题】:what is the difference betwee new int() and new int[] [duplicate]new int() 和 new int[] 之间有什么区别 [重复]
【发布时间】:2018-02-25 20:10:13
【问题描述】:
int main()
{
  int *y = new int(5);
  cout << "y = " << y << " &y = " << &y << " *y = " << *y << endl;
  int *p = new int[5];
  cout << "p = " << p << " &p = " << &p << " *p =" << *p << endl;
}

一个使用[],另一个使用(),有什么不同,它是如何工作的?有人可以帮我解释一下吗?谢谢!

【问题讨论】:

  • 您的 C++ 书籍对此有何评论?
  • 谢谢!!这对我帮助很大。 int *y = new int(5) 表示将值 5 赋予 *y。但 int[5] 表示将 5 个 int 数字空格。

标签: c++ arrays dynamic


【解决方案1】:
int *y = new int(5)

这会分配一个int 并将其值设置为5,然后分配y 以指向分配的int

int *p = new int[5]

这会分配一个由 5 个ints 组成的数组,其值最初是未定义的,然后将p 分配为指向分配数组中的第一个int

【讨论】:

    【解决方案2】:

    你在std::cout 中输出了这么多东西,但大多数都无关紧要。

    试试

    std::cout << sizeof(int(5)) << " " << sizeof(int[5]) << "\n";
    

    哪个会输出

    4 20
    

    因为int(5) 表示用5 初始化的单个整数。所以sizeof 产生int 的大小。

    另一方面,int[5] 是您所期望的:一个由 5 个整数组成的数组,因此 sizeof 产生 5*sizeof(int)

    另外两句:

    • new 创建好的旧数组绝对是初学者应该避免的事情。如果您需要动态大小的可索引存储,请使用std::vector。没有速度限制。
    • 不要使用using namespace std;,只需键入std::,这样可以使代码更具可读性,并清楚地将您的内容与库内容区分开来。

    【讨论】:

    • 帮我深入了解!
    • "没有速度惩罚" - 不正确。 std::vector 的速度会稍微变慢。 new int[5] 分配内存但不填充它。 vector&lt;int&gt;(5)(或vector.resize(5))分配内存并对其进行零初始化。此外,原始指针上的operator[] 只是指针加上偏移量的简单解引用,而std::vector 上的operator[] 是必须操纵调用堆栈的函数调用。速度差异可以忽略不计,但确实存在。
    • @RemyLebeau 编译器会内联对操作符的调用。
    猜你喜欢
    • 2017-10-17
    • 2020-09-24
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多