与C ++中动态分配的数组关联的内存位置

时间:2015-05-23 11:20:03

标签: c++ arrays pointers

给出以下代码:

int *myArray = new int[ 1 ];
myArray[0] = 42;

std::cout << "myArray: " << myArray << std::endl;
std::cout << "&myArray: " << &myArray << std::endl;
std::cout << "*myArray: " << *myArray << std::endl;

我得到以下输出:

  

myArray:0x7fca304038c0
  &amp; myArray:0x7fff544a9b90
  * myArray:42

解除引用器的结果(例如,* myArray)是有意义的:它返回数组的第一个(也是唯一的)元素。但为什么myArray和&amp; myArray会返回不同的内存位置?

myArray是内存中数组第一个元素的位置吗?实际上,通过将数组设置为NULL来将此值设置为0x0。

&amp; myArray是指向内存中myArray的指针的位置 - 因此不会被delete[]更改或将数组设置为NULL吗?

3 个答案:

答案 0 :(得分:6)

变量myArray是一个指针。指针的是您调用new

时返回的地址

&myArray的值是myArray变量内存中的地址。这与通过new

分配的地址空间不同

看起来你的混淆来自于指针变量的值与指针变量本身的地址之间的区别。

答案 1 :(得分:3)

new运算符为堆上的数组分配了空间,这是打印myArray的时得到的空间(指向数组开头的指针)。但是,指针本身是一个局部变量并驻留在堆栈上,这是打印myArray(&myArray)地址时获得的。

delete[] - 这个数组会使你得到的堆存储无效(所以以后使用它,如果你还有那个地址,会调用未定义的行为),但是不会伤害指针本身,只需要价值毫无意义。例如,您可以重复使用相同的指针来分配另一个数组。

答案 2 :(得分:2)

myArray是指向int的指针,也可以作为数组引用。所以这就是为什么它的价值是一个地址。

含义:

  

myArray是内存中数组第一个元素的位置吗?   实际上,在调用delete []时,该值设置为0x0。

&amp; myArray是内存中此指针的地址。如果你愿意,指针指针。所以:

  

&amp; myArray是指向内存中myArray的指针的位置 - 和   因此不会被delete []更改或将数组设置为NULL?

也是。

无关但可能有用: 我喜欢这个指针教程。它很清楚并且有很多代码示例 http://www.cplusplus.com/doc/tutorial/pointers/