根本原因是:因?yàn)?int x 在前, const int* y = &x 在后,原則上要求對(duì) *y 的任何操作不能導(dǎo)致 x 有違規(guī)行為。
我們先看另外一個(gè)例子:
const?int?x=3;?
int*?y=&x;
這里 *y 是個(gè)變量,是可讀可寫的,而對(duì) *y 的寫入操作(即再次賦值)會(huì)改變 x 的值,但 x 已經(jīng)被聲明為常量,不能重新賦值,所以對(duì) *y 重新賦值對(duì)于 x 來說是個(gè)違規(guī)操作。也就是說,對(duì) *y 的某些操作有可能導(dǎo)致 x 有違規(guī)行為,所以無法通過編譯。
回到原問題,
int?x;?const?
int?*y?=?&x;
這里,因?yàn)?*y 被聲明為一個(gè)常量,我們沒法直接對(duì) *y 二次賦值,所以對(duì) *y 的“任何操作”其實(shí)就只剩下一種操作,就是讀操作,即讀取 *y 的值。而這個(gè)操作是不會(huì)導(dǎo)致 x 有違規(guī)行為的,因?yàn)?x 是個(gè)變量,我們既能讀取它的值,又能改變它的值。所以對(duì) *y 的任何操作不會(huì)導(dǎo)致 x 有違規(guī)行為,因此是合法的,可以通過編譯。
2020-12-23
x將地址給了y,那么*y和x就是一體的,x改變*y也會(huì)改變,如果我下面的代碼改變了x,那*y也要變,可是*y不是收到了const的修飾不能變么
按照C指針的說法,第一句就是錯(cuò)的,y是指向x的指針,和x不是一體的,x是變量,x不管怎么變,y指向的地址是不變的。
const int * y 就是指向只讀變量的指針,不能改變值,但是可以指向別人
2019-12-02
*y是指向x的地址吧,加const表示指向的這個(gè)地址不變,所以不管x變化與否,*y還是指向x的地址,只是這個(gè)地址的值變了,因此*y的值變化,這是合法的。
2019-11-07
根本原因是:因?yàn)?int x 在前, const int* y = &x 在后,原則上要求對(duì) *y 的任何操作不能導(dǎo)致 x 有違規(guī)行為。
我們先看另外一個(gè)例子:
這里 *y 是個(gè)變量,是可讀可寫的,而對(duì) *y 的寫入操作(即再次賦值)會(huì)改變 x 的值,但 x 已經(jīng)被聲明為常量,不能重新賦值,所以對(duì) *y 重新賦值對(duì)于 x 來說是個(gè)違規(guī)操作。也就是說,對(duì) *y 的某些操作有可能導(dǎo)致 x 有違規(guī)行為,所以無法通過編譯。
回到原問題,
這里,因?yàn)?*y 被聲明為一個(gè)常量,我們沒法直接對(duì) *y 二次賦值,所以對(duì) *y 的“任何操作”其實(shí)就只剩下一種操作,就是讀操作,即讀取 *y 的值。而這個(gè)操作是不會(huì)導(dǎo)致 x 有違規(guī)行為的,因?yàn)?x 是個(gè)變量,我們既能讀取它的值,又能改變它的值。所以對(duì) *y 的任何操作不會(huì)導(dǎo)致 x 有違規(guī)行為,因此是合法的,可以通過編譯。
2019-09-15
一般來說都是變y吧