指针引用的值,用于初始化引用的指针。

问题描述 投票:1回答:3

好吧,我有一个微不足道的疑问,在下面的声明。

int a = 5;
int* ptr = &a; 
int &x = *ptr;
x = 3;
cout<<a;

输出为3。*ptr 将一个去参考的整数vaue传递给参考引用&x 但怎么会改变 x 变化 a?. *ptr 只是抛出了一个没有地址的输入法。xa's 地址?

c++ pointers reference output expression
3个回答
2
投票

在这个声明之后

int* ptr = &a; 

的指针ptr指向对象a。

指针的重新引用

int &x = *ptr;

产生一个对原始对象a的l值引用。

所以x现在是对象a的l值引用。

其效果与最初你写的

int &x = a;

摘自C++标准(5.3.1一元运算符)

1 单元*运算符执行间接操作:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针和 result是一个指向对象或函数的l值。 表达式所指向的地方。


1
投票

有这样一个不错的功能,你可以用C++来做。

你以前试过这个吗?

void somefunction(int &foo) {
     foo = 3;
}

当你像这样使用那个函数时。

int a = 5;
somefunction(a);
// From now on, a = 3

a会把它的值改成3

在你的代码中也是一样,你把值去掉了,但同时你把a传给了x。

当你在传递对象的时候,这很有用。你不希望做这样的事情。somefunction(&a). 这样会让你的代码更干净。


对不起,我在手机上,我不知道如何格式化还帖子。


1
投票

但为什么改变X就会改变A呢?

你不能 "改变 "引用。当你分配给 x所指的对象 x 是指分配。x 指的是 a因此,转让 x 是转让 a.

为什么编译器会将x与a的地址绑定?

既然指针 ptr 指向 a通过指针的间接性 *ptr 产生一个l值,指的是 a. 因此,如果你初始化了引用的 x 以这样的表达方式,该引用将被绑定到 a.

© www.soinside.com 2019 - 2024. All rights reserved.