我刚刚发现了参考变量,并且几乎没有什么问题让我烦恼。请参阅下面的代码。
int a = 3; //&a is 0x28fee
int b = 5; //&b is 0x16faa
int &ref = a; //&ref is 0x28fee
ref = b; //value of ref = 5, address is still 0x28fee
我知道参考变量的地址一旦设置就无法更改,但是当我运行命令时,我的引用值是如何变化但地址是相同的?
由于地址是相同的,因此ref的值仍然不是3,或者也许不应该将值改为5,因为一个地址如何有2个值。
最后,假设“&”是正确的。 sign与我们在指针中使用的符号相同吗?
答案 0 :(得分:6)
我知道参考变量的地址不能改变一次 集,
引用与地址无关。不要将引用视为特殊指针。
除非您在讨论编译器如何实现引用。但这是一个完全不同的抽象层次。在C ++程序员级别,您不是从与编译器编写器相同的角度来看语言;没有“参考变量的地址”这样的东西。对象具有地址,而引用只是命名对象的另一种方式。
或者,正如我想向初学者解释一样,引用是对象。
但是当我运行命令时,我的引用的值如何变化但是 地址是一样的吗?
在以下行中:
int &ref = a; //&ref is 0x28fee
您声明ref
是对a
的引用。使用上面的解释, ref
为a
。所以当你继续编写&ref
之后(使用&
字符来调用address-of运算符,而不是声明一个引用),会发生什么等同于写{{1}时发生的事情。 }}。因此,结果是相同的并不奇怪。它是同一个对象,因此地址必须相同。
&a
这与撰写ref = b; //value of ref = 5, address is still 0x28fee
相同。它将a = b;
的值分配给b
,因为a
只是说ref
的另一种方式。将值分配给a
时,不会更改任何地址。
最后,假设“&”是正确的。标志和我们一样 在指针中使用?
不,一点也不。重申我的观点:int
在C ++中有不同的含义。您可以使用它来声明引用或以获取对象的地址。实际上,还有更多含义,考虑到&
也是按位运算符,如&
中所示。成对的a & b
,即&
,扩展了可能含义的列表,包括逻辑AND运算符和C ++ 11右值引用。
从教学的角度来看,当然遗憾的是&&
因参考声明和地址操作符而被重载。据我所知,&
被选为参考文献,因为当时很难将新的关键字(如&
)添加到C ++中,因为与C的向后兼容性在当时是一个巨大的问题,并且添加ref
作为关键字意味着像ref
这样的C代码将不再编译。
C ++必须至少引入一些新的关键字(例如int ref = 0;
),但在某些情况下,没有它们在技术上是可行的和/或政治上必要的。
答案 1 :(得分:3)
当我运行命令时,我的引用的值如何变化但地址是否相同?
引用是别名,当您为ref
分配值时,实际上将其分配给变量a
。你为什么期望地址改变?
或者可能不应该将价值变为5
这是正确的,当您在示例中更改引用ref
的值时,您也可以将ref
替换为a
,因此您拥有a = b
。
最后,假设"&"是正确的。 sign与我们在指针中使用的符号相同吗?
我不确定你在这里问的是什么,&
用于表示你想要一个引用,这里不使用它来获取变量a
的地址。