int x; const int *y = &x;为什么合法
x将地址给了y,那么*y和x就是一体的,x改变*y也会改变,如果我下面的代码改变了x,那*y也要变,可是*y不是收到了const的修饰不能变么,为什么合法0.0
x将地址给了y,那么*y和x就是一体的,x改变*y也会改变,如果我下面的代码改变了x,那*y也要变,可是*y不是收到了const的修饰不能变么,为什么合法0.0
2019-09-15
根本原因是:因为 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 有违规行为,因此是合法的,可以通过编译。
举报