为了账号安全,请及时绑定邮箱和手机立即绑定

int x; const int *y = &x;为什么合法

x将地址给了y,那么*y和x就是一体的,x改变*y也会改变,如果我下面的代码改变了x,那*y也要变,可是*y不是收到了const的修饰不能变么,为什么合法0.0

正在回答

4 回答

x将地址给了y,那么*y和x就是一体的,x改变*y也会改变,如果我下面的代码改变了x,那*y也要变,可是*y不是收到了const的修饰不能变么

按照C指针的说法,第一句就是错的,y是指向x的指针,和x不是一体的,x是变量,x不管怎么变,y指向的地址是不变的。

const int * y 就是指向只读变量的指针,不能改变值,但是可以指向别人

0 回复 有任何疑惑可以回复我~

*y是指向x的地址吧,加const表示指向的这个地址不变,所以不管x变化与否,*y还是指向x的地址,只是这个地址的值变了,因此*y的值变化,这是合法的。

0 回复 有任何疑惑可以回复我~

根本原因是:因为 int x 在前, const int* y = &x 在后,原则上要求对 *y 的任何操作不能导致 x 有违规行为。

我们先看另外一个例子:

const int x=3; 
int* y=&x;

这里 *y 是个变量,是可读可写的,而对 *y 的写入操作(即再次赋值)会改变 x 的值,但 x 已经被声明为常量,不能重新赋值,所以对 *y 重新赋值对于 x 来说是个违规操作。也就是说,对 *y 的某些操作有可能导致 x 有违规行为,所以无法通过编译。

回到原问题,

int x; const 
int *y = &x;

这里,因为 *y 被声明为一个常量,我们没法直接对 *y 二次赋值,所以对 *y 的“任何操作”其实就只剩下一种操作,就是读操作,即读取 *y 的值。而这个操作是不会导致 x 有违规行为的,因为 x 是个变量,我们既能读取它的值,又能改变它的值。所以对 *y 的任何操作不会导致 x 有违规行为,因此是合法的,可以通过编译。

0 回复 有任何疑惑可以回复我~
#1

六个蒸蛋

第二个框框的代码写错了,应该是 int x; const int *y = &x;
2019-11-07 回复 有任何疑惑可以回复我~

一般来说都是变y吧

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之离港篇
  • 参与学习       122700    人
  • 解答问题       474    个

C++扫清通往面向对象的最后一道障碍,将所有知识点融会贯通

进入课程

int x; const int *y = &x;为什么合法

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信