-1

这是与这个不同的问题,因为这里我使用的是对象类型struct,而不是值23...

我正在阅读关于指针的这一章,它说明了以下内容:

变量的地址可以通过在变量名称前加上 & 号来获得,称为地址运算符。例如:

MyStruct* myvar = new MyStruct();
&myvar; // what is this address?

我的理解是否正确,它是对象的地址new MyStruct(),而不是变量本身?我还没有很好地理解变量(不是它们引用的对象)是如何存储的,而且很可能在编译程序时根本没有使用它们。

4

3 回答 3

4

根据您之前的问题,它不是......它是变量的地址myvar......

编辑

所以 new Struct() 的实际字节存储在与变量不同的地址下?

new返回分配“字节”的内存地址struct。的值myvar将是“字节”在内存中放置&myvar的地址,并且是变量myvar在内存中放置的地址。

-------------------------------------------------------
|                     M E M O R Y                     |
-------------------------------------------------------
|   --------------                   ---------------  |
|   | myvar = 234| ----points to---> | new MyStruct|  |
|   --------------                   ---------------  |
|   ^                                ^                |
|   |                                |                |
|   address 1 (&myvar)               address 234      |
|                                                     |
-------------------------------------------------------
于 2017-04-06T07:00:57.363 回答
2

我的理解是否正确,它是对象的地址new MyStruct(),而不是变量本身?

不,它是返回的对象初始化的变量的地址。myvarnew Struct();

于 2017-04-06T07:00:09.287 回答
1

你得到的基本上是指针的副本。以下是您可以证明的方法:

int* ptr = new int(2);
int& i = *ptr;
std::cout<<i<<std::endl; //prints 2
ptr = new int(3); //now ptr points to another address
std::cout<<*ptr<<std::endl; //prints 3
std::cout<<i<<std::endl; //still prints 2!

忽略这里糟糕的内存管理,你会看到你只有一个引用,它是一个内存位置的副本。如果更改原始指针,它不会改变。这是否回答你的问题?

于 2017-04-06T07:02:54.343 回答