C++ 如何从引用中获取指针?
似乎有很多关于指针和引用的相关问题,但我找不到我想知道的。基本上,对象是通过引用传入的:C++ 如何从引用中获取指针?,c++,C++,似乎有很多关于指针和引用的相关问题,但我找不到我想知道的。基本上,对象是通过引用传入的: funcA(MyObject &objRef) { ... } 在函数中,我可以获得指向该对象的指针而不是引用吗?如果我将引用objRef视为MyObject的别名,那么&objRef实际上会给我一个指向MyObject的指针吗?看起来不太可能。我很困惑 编辑:经过仔细检查,objRef确实给了我指向我需要的对象的指针-你们大多数人给了我正确的信息/答案,非常感谢。在本例中,我选择了最能说明问题的
funcA(MyObject &objRef) { ... }
在函数中,我可以获得指向该对象的指针而不是引用吗?如果我将引用objRef
视为MyObject
的别名,那么&objRef
实际上会给我一个指向MyObject的指针吗?看起来不太可能。我很困惑
编辑:经过仔细检查,
objRef
确实给了我指向我需要的对象的指针-你们大多数人给了我正确的信息/答案,非常感谢。在本例中,我选择了最能说明问题的答案。使用引用上的地址运算符
MyObject *ptr = &objRef;
&objRef
应用于引用的任何运算符都将实际应用于引用的对象(§5/5[expr]);可以将引用视为同一对象的另一个名称。因此,获取引用的地址将为您提供引用对象的地址 它实际上未指明引用是否需要存储(§8.3.2/4[dcl.ref]),因此获取引用本身的地址没有意义 例如:
int x = 5;
int& y = x;
int* xp = &x;
int* yp = &y;
在上面的示例中,
xp
和yp
是相等的-也就是说,表达式xp==yp
的计算结果为true
,因为它们都指向同一个对象。是的,将运算符的地址应用到引用与获取原始对象的地址相同
#include <iostream>
struct foo {};
void bar( const foo& obj )
{
std::cout << &obj << std::endl;
}
int main()
{
foo obj;
std::cout << &obj << std::endl;
bar( obj );
return 0;
}
<>在C++中,引用是一种受限类型的指针。它只能被赋值一次,并且不能有空值。
引用在用于指示函数的参数是通过引用传递的,而变量的地址是通过引用传递的时最有用。如果没有引用,则使用传递值。一般解决方案是使用
std::addressof
,如下所示:
#include <type_traits>
void foo(T & x)
{
T * p = std::addressof(x);
}
#包括
void foo(T&x)
{
T*p=std::addressof(x);
}
无论T
是否重载运算符&
。在引用上使用(&
)运算符的地址
MyObject *ptr = &objRef;
&objRef
与引用上使用的任何其他运算符一样,这实际上会影响引用的对象
正如@Kerrek所指出的,由于运算符影响引用的对象,如果该对象有一个重载的
运算符&
函数,它将调用它,并且需要std::address\u的,可能需要指针数学,或者另一个API可能需要指针。如果您只是得到引用的地址怎么办&objRef
@DrewDormann,什么,通过引用传递的对象地址上的指针数学?在我看来,这不是一个好的设计。一个例子是传入一个引用,解析二进制流(如reinterpret\u cast
)需要一个指针类型。引用不仅仅是同一对象的另一个名称(引用的生存期与它指向的对象的生存期不同)。但是,您的示例代码可以工作,因为在引用上使用任何运算符实际上都使用目标对象。@Ben:是的,我总是发现单边参数(博客)是了解真相的最好方法。你自己说的参考是别名。别名=>“另一个名称”。对完美的法律规范仍然会导致未定义的行为。我要说的是有效代码(即不调用未定义的行为)引用的持续时间不会超过它所引用的对象,并充当对象的另一个名称。您的意思是:当我们调用未定义的行为时,引用的行为类似于指针。我说是的,那又怎样。@Loki:我用另一个int
替换了一个int
,在完全相同的位置,没有问题。很明显,它是一个新对象(析构函数在旧对象上运行,构造函数在新对象上运行)。标准还说这是一个新的对象。我看不出你新发现的方法(取代现在被否决的未定义行为的主张)有任何意义,因为它完全消除了“对象生命周期”一词的任何含义。看起来更像是为了原谅你对我的评论和示例的重复攻击。@Loki:新对象是一个int
,见第44行。你只是在证明你既没有阅读也没有理解我的例子。而且根本不需要一个新的物体。阅读同一节第6段。C++引用绑定到内存位置,而不是对象。就像一个指针。标准的措辞支持这一点,你没有任何相反的证据。同意。对于将来遇到这种情况并感到好奇的人,我只想指出,§3.8.1([basic.life]/1)明确规定,对于T
类型的对象,其生命周期从“获得类型T
具有适当对齐和大小的存储,如果对象具有非平凡初始化,则其初始化已完成。”,并且当“如果T
是具有非平凡析构函数(12.4)的类类型时,其生存期结束,析构函数调用开始,或者对象占用的存储被重用或释放。”(根据C++14标准。)不。引用是现有对象的别名。当你开始做更复杂的事情时,把它当作一个奇特的指针只会让你感到困惑。@Loki:引用是一个句柄。指针也是。它们都消耗存储空间(除非优化了)并且与所引用的对象具有不同的寿命。相似之处大大超过了不同之处。@BenVoigt:在术语上要小心。Handle在comp sci中有其他含义。但我同意你的观点。但我不同意你的观点。另外,请注意8.3.2参考文献[dcl.ref]第4段未说明