【发布时间】:2017-08-22 15:26:39
【问题描述】:
这看起来是一个非常基本的话题,但对我来说非常重要。
下面的例子显示了引用变量的地址等于原始变量的地址。我知道这是我们对 C/C++ 概念的期望。但是,是否始终保证这些地址在任何情况下都是相等的?
#include <iostream>
#include <vector>
#include <string>
class Point
{
public:
double x,y;
};
void func(Point &p)
{
std::cout<<"&p="<<&p<<std::endl;
}
int main()
{
std::vector<Point> plist;
plist.push_back({1.0,4.0});
plist.push_back({10.0,20.0});
plist.push_back({3.0,5.0});
plist.push_back({7.0,0.4});
std::cout<<"&plist[2]="<<&plist[2]<<std::endl;
func(plist[2]);
return 0;
}
结果:
&plist[2]=0x119bc90
&p=0x119bc90
【问题讨论】:
-
对于它们可能是什么,您还有其他想法吗?
-
参考文献没有地址。对象有地址。一个对象只有一个地址。引用指的是它被初始化的对象。不要复制它。
-
@n.m.:参考文献有时有地址,只是很难找到它们。特别是,
&r不使用引用r的地址,就像r + 1进行指针运算一样。间接在任何操作之前自动完成,因此&r类似于&(*p)。 -
你必须考虑到甚至不能保证
&foo是foo的地址,因为operator&可以实现返回它喜欢的任何东西。是否有意义当然是一个不同的问题;)
标签: c++ pointers reference lvalue