如何从参考中获取指针?

似乎有很多关于指针和引用的相关性问题,但我找不到我想知道的内容。 基本上,一个对象被引用传入:

funcA(MyObject &objRef) { ... } 

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

编辑:进一步检查, objRef确实把我指向对象,我需要的指针 – 你们大多数给了我正确的信息/答案,非常感谢。 在这种情况下,我回答这个问题似乎是最具说明性的。

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

 #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 

应用于引用的任何运算符实际上将应用于它所引用的对象( §5/ 5 [expr] ); 该参考可以被认为是同一个对象的另一个名称。 因此,参考的地址将给你所指对象的地址。

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

举个例子:

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

在上面的例子中, xpyp是相等的 – 也就是说,expression式xp == yp计算结果为true因为它们都指向相同的对象。

一般的解决方法是使用std::addressof ,如下所示:

 #include <type_traits> void foo(T & x) { T * p = std::addressof(x); } 

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

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

 &objRef 

像其他运算符一样,这​​实际上会影响被引用的对象。

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

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

 MyObject *ptr = &objRef; 

在C ++中,引用是指针的受限types。 它只能分配一次,不能有NULL值。 引用在用于指示parameter passing给引用的情况下最有用,其中传递variables的地址。如果没有引用,则会使用传递值。