这是与this one不同的问题,因为我在这里使用对象类型struct
,而不是值23...
。
我在指针上阅读this chapter,它说明了以下内容:
变量的地址可以通过在a的名称前面获得 带有&符号(&)的变量,称为地址运算符。对于 例如:
MyStruct* myvar = new MyStruct();
&myvar; // what is this address?
我的理解是否正确,它是对象new MyStruct()
的地址,而不是变量本身?我还没有很好地理解变量(不是它们引用的对象)是如何存储的,并且很可能在编译程序时根本不使用它们。
答案 0 :(得分:4)
根据您的previous question:否,它不是......它是变量myvar
的地址......
修改强>
所以新的Struct()的实际字节存储在与变量不同的地址下?
new
返回内存的地址,其中" bytes" struct
的分配。
myvar
的值将是" bytes"的地址。放在内存中,&myvar
是变量myvar
放在内存中的地址。
-------------------------------------------------------
| M E M O R Y |
-------------------------------------------------------
| -------------- --------------- |
| | myvar = 234| ----points to---> | new MyStruct| |
| -------------- --------------- |
| ^ ^ |
| | | |
| address 1 (&myvar) address 234 |
| |
-------------------------------------------------------
答案 1 :(得分:2)
我的理解是否正确,它是对象
new MyStruct()
的地址,而不是变量本身?
不,是 <{1}}的地址,已初始化与myvar
返回的对象。
答案 2 :(得分:1)
你得到的基本上是指针的副本。这是you can prove it:
的方式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!
在此处忽略错误的内存管理,您会看到只有一个引用,它是内存位置的副本。如果更改原始指针,则不会更改。这会回答你的问题吗?