对解除引用的指针的引用地址是否与指针的地址相同?

时间:2011-05-19 14:40:07

标签: c++ pointers reference memory-address

在C ++中,对解除引用指针的引用的地址是否保证与指针的地址相同?

或者,用代码编写,以下断言保证始终保持为真?

SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);

4 个答案:

答案 0 :(得分:3)

是的,这是正确的,并且永远是真的。

引用只不过是它所指的类型的别名。它没有单独的存在,它总是与它所指的那个相关联。

答案 1 :(得分:3)

是的,前提是someAddress不是空指针,或者不允许取消引用。在这种情况下,行为是未定义的,尽管您的实现可能表现得相同,尤其是在优化级别较低的情况下。

如果你想要精确,那么&ref实际上不是“引用的地址”,它是“引用的引用地址”。由于ref绑定到*ptr,这意味着ref的referand和ptr的referand(或者如果你喜欢的指针)是同一个对象,因此这两个地址&refptr相等。

正如Bo指出的那样,你要比较&ref的是“指针的值”,或“指针中存储的地址”,而不是“指针的地址”。 / p>

答案 2 :(得分:2)

是的,如果引用本身有一个地址,它由实现管理,不能从代码访问。在任何情况下,它只是同一个对象的不同名称。

答案 3 :(得分:1)

是的,您的理解是正确的。对于99.(9)%的代码,您的代码将是正确的。对于观众中的学生(我自己),这种说法并不总是正确的:

SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);

考虑这个程序:

#include <cassert>
struct SomeType { void* operator&() { return 0; } };
int main() {
  SomeType *ptr = new SomeType;
  SomeType &ref = *ptr;
  assert(&ref == ptr);
}