Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++ 如何从引用中获取指针?_C++ - Fatal编程技术网

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段未说明