引用变量的地址和值C++

A reference variable's address and value C++

本文关键字:C++ 地址 变量 引用      更新时间:2023-10-16

我刚刚发现了引用变量,有一些问题困扰着我。请参阅下面的代码。

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吗,或者a的值可能不应该变为5,因为一个地址怎么可能有两个值?

最后,假设"&"符号与我们在指针中使用的符号相同,这正确吗?

我知道引用变量的地址不能更改一次设置,

参考文献与地址无关。不要把引用看作是特殊的指针。

除非您讨论的是编译器如何实现引用。但这是一个完全不同的抽象层次。在C++程序员级别上,您并不是从与编译器编写者相同的角度来看待该语言;不存在"引用变量的地址"这样的东西。对象有地址,引用只是命名对象的另一种方式。

或者,正如我喜欢向初学者解释的那样,引用就是对象。

但是当我运行命令时,我的引用值是如何变化的地址是一样的吗?

在以下行中:

int &ref = a;   //&ref is 0x28fee

您正在声明ref是对a的引用。使用上面的解释,ref就是a。因此,当您随后继续编写&ref时(使用&字符来调用运算符的地址,而不是声明引用),所发生的情况与编写&a时发生的情况等效。因此,结果完全相同也就不足为奇了。它是同一个对象,所以地址必须相同。

ref = b;        //value of ref = 5, address is still 0x28fee

这与写入a = b;相同。它将b的值分配给a,因为ref只是a的另一种说法。将值分配给int s时,不会更改地址。

最后,假设"&"符号与我们在指针中使用?

不,一点也不。重申我的观点:&在C++中有不同的含义。您可以使用它来声明引用以获取对象的地址。事实上,考虑到&也是位AND运算符,与a & b一样,还有更多的含义。成对的&,即&&,扩展了可能含义的列表,以包括逻辑AND运算符和C++11右值引用。


从教学的角度来看,&的引用声明和运算符地址过载当然是不幸的。据我所知,之所以选择&作为参考,是因为当时很难向C++添加新的关键字(如ref),因为与C的向后兼容性在当时是一个巨大的问题,而添加ref作为关键字意味着像int ref = 0;这样的C代码将不再编译。

C++必须至少引入一些新的关键字(例如throw),但在某些情况下,在技术上和/或政治上都有必要不使用它们。

当我运行命令时,我的引用的值是如何变化的,但地址是相同的?

引用是一个别名,当您将值分配给ref时,实际上是将其分配给变量a。为什么您希望地址更改?

或者也许a的值不应该变成5

这是正确的,当您在示例中更改引用ref的值时,您也可以将ref替换为a,这样您就有了a = b

最后,假设"&"符号与我们在指针中使用的符号相同,这正确吗?

我不确定您在这里问什么,&用于指定您想要一个引用,而不是用于获取变量a的地址。