如何从引用获取指针?

似乎有很多相关的问题在讨论指针和引用,但是我找不到我想知道的。基本上,一个对象是通过一个引用传入的:

funcA(MyObject &objRef) { ... }

在函数中,我可以得到一个指向该对象的指针而不是引用吗?如果我将引用 objRef作为 MyObject的别名,那么 &objRef会给我一个指向 MyObject 的指针吗?看起来不太可能。我很困惑。

编辑: 经过仔细检查,objRef确实给了我指向我需要的对象的指针-大多数人给了我正确的信息/答案,非常感谢。在这个例子中,我沿着似乎最能说明问题的答案走了下去。

82778 次浏览

在引用上使用地址运算符。

MyObject *ptr = &objRef;

应用于引用的任何操作符实际上都将应用于它所引用的对象(5/5[ expr ]) ; 引用可以被视为同一对象的另一个名称。因此,获取引用的地址将给出它所引用的对象的地址。

它实际上没有指定引用是否需要存储(8.3.2/4[ dcl.ref ]) ,因此获取引用本身的地址是没有意义的。

举个例子:

int x = 5;
int& y = x;
int* xp = &x;
int* yp = &y;

在上面的示例中,xpyp是相等的-也就是说,表达式 xp == yp的计算结果为 true,因为它们都指向同一个对象。

是的,对引用应用 address-of 操作符与获取原始对象的地址相同。

#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;
}

结果:

0x22ff1f
0x22ff1f

在 C + + 中,引用是一种受限制的指针类型。它只能分配一次,而且永远不能有 NULL 值。 当引用用于指示函数的参数正在通过引用传递时,引用是最有用的,因为引用传递的是变量的地址。如果没有引用,则使用 Pass By Value。

一般的解决方案是使用 std::addressof,比如:

#include <type_traits>


void foo(T & x)
{
T * p = std::addressof(x);
}

无论 T是否重载 operator&,这都是有效的。

在引用上使用 address-of (&)操作符。

&objRef

与引用中使用的任何其他运算符一样,这实际上会影响所引用的对象。

正如@Kerrek 所指出的,由于操作符会影响被引用的对象,因此如果该对象有一个重载的 operator&函数,那么它将调用它,并且需要 std::address_of来获得真正的地址。