如何从引用中获取指针?

时间:2012-02-13 16:00:36

标签: c++

似乎有许多关于指针与参考的相关问题,但我找不到我想知道的东西。基本上,对象通过引用传递:

funcA(MyObject &objRef) { ... }

在函数中,我可以获得指向该对象而不是引用的指针吗?如果我将引用objRef视为MyObject的别名,&objRef实际上会给我一个指向MyObject的指针吗?这似乎不太可能。我很困惑。

编辑:经过仔细检查,objRef确实给了我指向我需要的对象的指针 - 大多数人给了我正确的信息/答案,非常感谢。在这种情况下,我的回答似乎是最具说明性的。

6 个答案:

答案 0 :(得分:88)

是的,将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

答案 1 :(得分:32)

应用于引用的任何运算符实际上将应用于它引用的对象(§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,因为它们都指向同一个对象。

答案 2 :(得分:24)

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

#include <type_traits>

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

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

答案 3 :(得分:5)

在引用上使用地址(&)运算符。

&objRef

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

正如@Kerrek指出的那样,由于运算符会影响引用的对象,如果该对象具有重载的operator&函数,则会调用它,并且需要std::address_of才能获得真正的地址

答案 4 :(得分:4)

在参考上使用地址运算符。

MyObject *ptr = &objRef;

答案 5 :(得分:-3)

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