好吧,我有一个微不足道的疑问,在下面的声明。
int a = 5;
int* ptr = &a;
int &x = *ptr;
x = 3;
cout<<a;
输出为3。*ptr
将一个去参考的整数vaue传递给参考引用&x
但怎么会改变 x
变化 a
?. *ptr
只是抛出了一个没有地址的输入法。x
到 a's
地址?
在这个声明之后
int* ptr = &a;
的指针ptr指向对象a。
指针的重新引用
int &x = *ptr;
产生一个对原始对象a的l值引用。
所以x现在是对象a的l值引用。
其效果与最初你写的
int &x = a;
摘自C++标准(5.3.1一元运算符)
1 单元*运算符执行间接操作:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针和 result是一个指向对象或函数的l值。 表达式所指向的地方。
有这样一个不错的功能,你可以用C++来做。
你以前试过这个吗?
void somefunction(int &foo) {
foo = 3;
}
当你像这样使用那个函数时。
int a = 5;
somefunction(a);
// From now on, a = 3
a会把它的值改成3
在你的代码中也是一样,你把值去掉了,但同时你把a传给了x。
当你在传递对象的时候,这很有用。你不希望做这样的事情。somefunction(&a)
. 这样会让你的代码更干净。
对不起,我在手机上,我不知道如何格式化还帖子。
但为什么改变X就会改变A呢?
你不能 "改变 "引用。当你分配给 x
所指的对象 x
是指分配。x
指的是 a
因此,转让 x
是转让 a
.
为什么编译器会将x与a的地址绑定?
既然指针 ptr
指向 a
通过指针的间接性 *ptr
产生一个l值,指的是 a
. 因此,如果你初始化了引用的 x
以这样的表达方式,该引用将被绑定到 a
.