引用的地址
Address of a reference
所以我正在和一个朋友讨论关于引用和指针的问题。
我们讨论的是"你可以取一个指针的地址但你不能取一个引用的地址"
我不同意这一点。让我们举个例子:
int x = 0;
int &xRef = x;
cout << &xRef << &x <<endl;
这个例子显示了相同的地址,但我不是通过执行&xRef
来获取xRef
的地址。难道你不认为我们有两个具有相同地址的变量,所以即使我取的是引用的地址,它仍然是引用的地址(即使那是x的地址)?
c++标准n3337 § 8.3.2/4
未指定引用是否需要存储空间(3.7)。
所以这是未指定的引用是否有存储空间。很可能不会。它只是别名。当你在代码中使用它时,编译器会进行一些特殊的操作,它可能会做一些类似于指针操作的事情。
一元操作符&返回指定对象的地址。引用不是对象。它是对对象的引用。所以这个语句
cout << &xRef << &x <<endl;
在这两种情况下都输出属于x的指定对象的地址。尽管编译器可以为引用分配内存,但引用本身没有地址,也就是说你不能应用operator &来得到它的地址。它是由具有地址的引用所引用的对象(或函数)。
您可以将引用视为对象的别名。因此,在您的示例中,&xRef
声明xRef
,这是 x
的另一个名称。因此,您打印了同一对象的两次地址。
当您在示例中应用地址操作符时,引用和实际对象之间不再存在区别。引用是对象。
该规则只适用于试图声明指向引用的指针的时候。试一试:
int x = 0;
int &*ptr = &x;
结果与MSVC 2013:
error C2528: 'ptr' : pointer to reference is illegal
为了完整起见:有一种方法可以生成指向引用的指针。
auto foo(int &x){
return [&]{std::cout << x;};
}
编译器在这里允许做的不是捕获对x
的引用,而是捕获堆栈指针。基于堆栈指针,编译器知道foo
的各种参数的偏移量,并可能为lambda节省一些内存。但是,在返回lambda之后,foo
的参数消失了,并且lambda引用的对象不存在。因此,禁止/UB这样做
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 右值引用转换后的地址更改
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 获取通用/前向引用地址有什么意义?
- 按引用传递和按地址传递之间的差异
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 常量引用函数参数的地址何时唯一?
- 通过引用传递是否涉及复制地址
- 总是引用的地址等于源地址
- 在函数中传递变量的指针和引用/地址
- 为什么取消引用的指针指向指针的 std::cout 会导致 -fsanitize=地址投诉?
- 如何通过引用获取引用变量的地址?
- 取消引用地址时是否可以重定向到其他地址?
- 在 C++ 03 中,如何引用一个被煽动的模板函数的地址
- 取消引用的输入迭代器的地址?istream_iterator的情况
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 变量循环范围会导致返回局部变量的地址引用
- 使用cout,如何将char转换为变量的地址/引用(?)
- 为什么函数不能更改其参数对象的地址/引用值?