如何从参考中获取指针?
似乎有很多关于指针和引用的相关性问题,但我找不到我想知道的内容。 基本上,一个对象被引用传入:
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;
在上面的例子中, xp
和yp
是相等的 – 也就是说,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的地址。如果没有引用,则会使用传递值。