在C ++中,对解除引用指针的引用的地址是否保证与指针的地址相同?
或者,用代码编写,以下断言保证始终保持为真?
SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);
答案 0 :(得分:3)
是的,这是正确的,并且永远是真的。
引用只不过是它所指的类型的别名。它没有单独的存在,它总是与它所指的那个相关联。
答案 1 :(得分:3)
是的,前提是someAddress
不是空指针,或者不允许取消引用。在这种情况下,行为是未定义的,尽管您的实现可能表现得相同,尤其是在优化级别较低的情况下。
如果你想要精确,那么&ref
实际上不是“引用的地址”,它是“引用的引用地址”。由于ref
绑定到*ptr
,这意味着ref
的referand和ptr
的referand(或者如果你喜欢的指针)是同一个对象,因此这两个地址&ref
和ptr
相等。
正如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);
}