似乎有许多关于指针与参考的相关问题,但我找不到我想知道的东西。基本上,对象通过引用传递:
funcA(MyObject &objRef) { ... }
在函数中,我可以获得指向该对象而不是引用的指针吗?如果我将引用objRef
视为MyObject
的别名,&objRef
实际上会给我一个指向MyObject的指针吗?这似乎不太可能。我很困惑。
编辑:经过仔细检查,objRef
确实给了我指向我需要的对象的指针 - 大多数人给了我正确的信息/答案,非常感谢。在这种情况下,我的回答似乎是最具说明性的。
答案 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;
在上面的示例中,xp
和yp
相等 - 也就是说,表达式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。