两个数组声明方法c ++之间的区别
这些可能有很多种方法在c ++中声明数组(并为它们分配内存)
1. int a[3];
2. int *b = new int[3];
我想了解c ++如何以不同的方式对待它们。
一个。 在这两种情况下,我可以使用以下语法访问数组: a[1]
和b[1]
湾 当我尝试cout<< a
和cout<< b
,都会打印各个数组的第一个元素的地址。
它看起来好像将a和b都视为指向数组的第一个元素的指针。
C。 但奇怪的是,当我尝试cout << sizeof(a)
和sizeof(b)
它们分别输出不同的值 - 4和12。
我不明白为什么在sizeof(b)
情况下,整个数组的大小正在被打印。
a
是一个数组( int [3]
)
b
是一个指针(类型为int*
)
在C ++中,它们是完全不同的东西。
所述sizeof
阵列是倍的每个元件的尺寸元件的数量。
所述sizeof
一个指针是独立的阵列(通常是4或8个字节)的大小的。
数组和指针唯一共同的地方就是数组经常在几种情况下“衰减”指针。 当你打印出他们的价值时,就是这样。
正如你所指出的,似乎a
和b
都是指向数组开始的指针。 但实际上,只有b
是一个指针。 a
实际上是一个数组。
编写(或阅读)代码时,两者之间的差异很微妙。 变量a
被视为一个常规变量(就像一个int
或double
),因为它有一个自动分配的内存部分分配给它。 为了比较,假设你已经声明了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