【问题标题】:Does address-of operator return address of an object referenced by the variableaddress-of 运算符是否返回变量引用的对象的地址
【发布时间】:2017-04-06 06:57:15
【问题描述】:

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

我正在阅读关于指针的this chapter,它指出以下内容:

变量的地址可以通过在变量名前面来获得 带有与号 (&) 的变量,称为地址运算符。为了 示例:

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

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

【问题讨论】:

  • 你试过编译这个吗?
  • MyStruct myvar = new Struct(); 不是有效的 C++。您可能打算写 MyStruct* myvar = new MyStruct(); 在这种情况下 foo = &myvar; 没有任何意义。请解决您的问题,无法回答。
  • 将 cplusplus.com 替换为 these 之一。
  • @Lundin,谢谢,更新了问题

标签: c++ addressof


【解决方案1】:

根据你的previous question,不是……是变量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      |
|                                                     |
-------------------------------------------------------

【讨论】:

  • 谢谢,所以new Struct() 的实际字节存储在与变量不同的地址下?
  • new 返回分配结构“mytes”的内存地址。因此 myvar 的值将是“字节”在内存中放置的地址,而 &myvar 是变量 myvar 放置在内存中的地址。
  • 是的,我知道,所以假设它返回234,也就是new Struct()创建的对象的第一个字节的地址,我的问题本质上是&myvar返回@987654334 @ 或其他地址?
  • 看看我的编辑,我希望它足够清楚。 234myvar的值,地址会不一样
  • 谢谢,现在清楚了,如果myvar 持有address 2 ,怎么输出呢?
【解决方案2】:

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

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

【讨论】:

  • 谢谢,new Struct() 的实际字节存储在与变量不同的地址下?
  • 要编译这段代码,myvar 必须是一个指针。所以这个问题无法回答,因为它没有任何意义。
  • @Maximus 不,myvar 指向地址位置的开始,仅此而已。 &myvarmyvar 本身所在的位置。
【解决方案3】:

你得到的基本上是指针的副本。这是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!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多