两个问题: 1)参考变量如何存储在mem?
中int a=1;
int &b=a;
cout<<&a<<endl<<&b;
a和b的地址相同?所以,b作为参考变量在mem中没有空格?!
2)引用变量只能在定义时初始化,但是如果它可以初始化多次?如何编写代码(只是为了告诉表单本身)?
int a=c=1;
int &b=a;
b=c;//i know this will change the source value of a,not re-assign the ref b,so
&b=c;//will this be ok?
答案 0 :(得分:7)
语言没有指定如何存储引用,但大多数编译器会在内部将它们实现为指针。
无论如何,由于引用对程序员来说是“透明的”,因此当您编写&b
时,您实际上是在获取引用的地址,而不是引用的地址。这就是为什么你得到相同的地址。
类似地,写&b=c
对引用本身没有任何作用,但是将值c
写入指针a
(无意义的东西)。它与int* ptr = &b; ptr = c;
请务必将&
理解为“地址”,将&
理解为引用类型表示法,are two different things:
int a;
int* ptr = &a; // <--- taking (and storing) the address of `a`, i.e. a pointer
int& b = a; // <--- declares a reference to `a`; `b` now behaves like `a`
// Two entirely different meanings of `&`.
还有&
的第三个含义,即按位AND 。
无论如何,如果你想重新安排参考资料,那你就不走运了。你根本做不到。
答案 1 :(得分:1)
&b
为您提供与&a
相同的值这一事实并未说明b
存储在内存中的位置(如果有的话)。 C ++语言没有为您提供任何确定引用本身地址的方法。根据定义,您的&b
评估为&a
。如果存在这种表示,它与b
在内存中的表示的实际地址完全没有关系。
引用是否在内存中具有表示是未指定的。实际上,它可能很容易因一个上下文而异:一些引用会占用内存,另一些则不会。在您的特定示例中,编译器很可能不会为b
创建任何内存表示。它只会将b
视为a
的另一个名称。
但即使编译器决定在内存中为b
分配内容,您仍然无法通过分析&b
的值来检测到这一事实。 &b
的值与此完全无关。
正如你自己所说的那样,“引用变量只能在定义时初始化”。没有办法“重新定义”现有的参考。没有办法“重新初始化”它。
答案 2 :(得分:1)
参考变量如何存储在mem?
中
根据标准§8.3.2/ 4:
未指明引用是否需要存储
因此无法保证引用存储在内存中。
引用变量只能在定义时初始化,但是如果可以初始化多次?
请记住&
位于:
int& x;
是该类型的一部分。虽然&
位于:
&var
是将返回var
地址的运算符。
它们是两个完全不同的东西。一个用于声明引用,另一个(通常,因为它可以重载)来获取某个l值的地址。
答案 3 :(得分:0)
我认为这里有一个混乱:
C ++标准规定了引用应该如何表现(并且值得注意的是,您不能让它们引用另一个对象,或者获取它们的地址应该产生与它们引用的对象的地址相同的值)。这与它们在引擎盖下如何实现无关......否则你就没有可移植性。
答案 4 :(得分:0)
C ++标准没有定义引用如何存储在内存中。实际上,也许它们并不总是需要存储,因为编译器可能会优化它们。这取决于您的编译器,编译器选项,操作系统以及程序中代码的上下文。对于这种情况,完全不可能给出一般答案。
相关的是可观察的行为。就这一点而言,引用是对象。它出现在不同的名称下,但它是同一个对象。这就是为什么一旦你有了引用,取其地址与取其原始名称下的对象地址相同。使用引用执行的所有操作与使用对象执行的操作相同,包括获取其地址。参考=对象。
正如您所看到的,这与指针有很大不同。 指针是他们自己的对象,可能恰好指向其他对象。您可以获取指针本身的地址,它将与指向对象的地址不同。
对象的引用对象的事实也意味着您以后不能引用引用其他内容。请记住,这只是一种以不同名称访问同一个对象的方法。