Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对未引用指针的引用的地址是否与指针的地址相同? 在C++中,引用指针的地址是否与指针的地址相同?< /P>_C++_Pointers_Reference_Memory Address - Fatal编程技术网

对未引用指针的引用的地址是否与指针的地址相同? 在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。