两个数组声明方法c ++之间的区别

这些可能有很多种方法在c ++中声明数组(并为它们分配内存)

1. int a[3];

2. int *b = new int[3];

我想了解c ++如何以不同的方式对待它们。

一个。 在这两种情况下,我可以使用以下语法访问数组: a[1]b[1]

湾 当我尝试cout<< acout<< b ,都会打印各个数组的第一个元素的地址。

它看起来好像将a和b都视为指向数组的第一个元素的指针。

C。 但奇怪的是,当我尝试cout << sizeof(a)sizeof(b)它们分别输出不同的值 - 4和12。

我不明白为什么在sizeof(b)情况下,整个数组的大小正在被打印。


a是一个数组( int [3]
b是一个指针(类型为int*

在C ++中,它们是完全不同的东西。

所述sizeof阵列是倍的每个元件的尺寸元件的数量。
所述sizeof一个指针是独立的阵列(通常是4或8个字节)的大小的。

数组和指针唯一共同的地方就是数组经常在几种情况下“衰减”指针。 当你打印出他们的价值时,就是这样。


正如你所指出的,似乎ab都是指向数组开始的指针。 但实际上,只有b是一个指针。 a实际上是一个数组。

编写(或阅读)代码时,两者之间的差异很微妙。 变量a被视为一个常规变量(就像一个intdouble ),因为它有一个自动分配的内存部分分配给它。 为了比较,假设你已经声明了int i 。 变量i是给内存中的一组连续字节的名称,用于保存一个整数值(机器上的4个字节)。 同样, a是赋予你的数组的连续字节集合的名称(在你的情况下是12个字节)。

相反, b只是指向单个内存位置的指针。 在你的情况下,有一个12字节的块被动态分配(通过new int[3] )。 b本身是一个自动分配的4字节指针,该指针指向该12字节块中的第一个int值。

所以他们真的是两种不同的东西。 这对C ++程序员来说不太清楚。 其中一个原因是您可以在两种类型上使用[]运算符。 另一个原因是数组在几种情况下隐式退化为指针(例如,在函数void Foo(int a[3]); a实际上不是数组,而是指向数组开头的指针)。 但不要被愚弄 - 数组不是指针(很多人声称),指针绝对不是数组。


1被分配在堆栈上。 编译时栈上的数组必须具有已知的大小。

2被分配在堆上。 堆上的数组没有这样的要求。 请记住,如果您使用new[]进行分配,则需要稍后使用delete[]取消分配它:

int* b = new int[3];
delete[] b;
链接地址: http://www.djcxy.com/p/13893.html

上一篇: difference between two array declaration methods c++

下一篇: Resizing std::vector without destroying elements