对未引用指针的引用的地址是否与指针的地址相同? 在C++中,引用指针的地址是否与指针的地址相同?< /P>
或者,用代码编写,以下断言是否保证始终为真对未引用指针的引用的地址是否与指针的地址相同? 在C++中,引用指针的地址是否与指针的地址相同?< /P>,c++,pointers,reference,memory-address,C++,Pointers,Reference,Memory Address,或者,用代码编写,以下断言是否保证始终为真 SomeType *ptr = someAddress; SomeType &ref = *ptr; assert(&ref == ptr); 是的,这是正确的,而且永远都是正确的。 引用只是它所引用类型的别名。它没有单独的存在,它总是与它所引用的对象绑定在一起。是的,如果引用本身有地址,则它由实现管理,不能从代码访问。在任何情况下,它只是同一对象的不同名称。是的,当然前提是someAddress不是空指针,或者不允许取消引用。在这种
SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);
是的,这是正确的,而且永远都是正确的。
引用只是它所引用类型的别名。它没有单独的存在,它总是与它所引用的对象绑定在一起。是的,如果引用本身有地址,则它由实现管理,不能从代码访问。在任何情况下,它只是同一对象的不同名称。是的,当然前提是
someAddress
不是空指针,或者不允许取消引用。在这种情况下,行为是未定义的,尽管您的实现很可能表现为它们是相等的,尤其是在优化级别较低的情况下
如果你想说得准确些,那么&ref
实际上不是“引用地址”,而是“引用地址和引用地址”。由于ref
绑定到*ptr
,这意味着ref
的refereand和ptr
的refereand(或指针)是同一个对象,因此&ref
和ptr
两个地址是相等的
正如Bo所指出的,你所比较的是“指针的值”或“指针中存储的地址”,而不是“指针的地址”。是的,你的理解是正确的。对于世界上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);
}
#包括
结构SomeType{void*运算符&({return 0;}});
int main(){
SomeType*ptr=新的SomeType;
SomeType&ref=*ptr;
断言(&ref==ptr);
}
@dlev:他怎么可能“尝试”是否保证是一样的?为什么他会问它是否有保证,如果他想知道的是,对于一个特定的程序,它是否恰好在一个特定的C++实现中是相等的?“史提夫,他显然不能,但是通过它运行几次应该更足以让你相信这是真的。也就是说,你是对的,他确实说过保证。代码是正确的,问题更“可疑”。我将“指针的地址”读为&ptr
,它与指向的对象的地址不同。@dlev:基于此,我确信sizeof(int)==sizeof(void*)
是有保证的。我预测前面会有坏消息;-)。我们只知道尝试Jesper的断言会给出正确的答案,因为我们碰巧知道有一个根本原因,为什么你会在任何地方得到相同的答案。但是如果你不知道每个地方都是一样的,那么你就不能依靠这个测试。如果你知道每个地方都是一样的,你已经知道这个问题的答案了…@Steve可能会出什么问题?不管怎么说,都是字节。+1重要的是要注意,&ref
并没有返回引用本身存储的地址,而是返回被引用对象的地址。由于学究气,我不得不注意到99.(9)仅仅等于100。