課程
/后端開發(fā)
/C++
/C++遠(yuǎn)征之離港篇
x將地址給了y,那么*y和x就是一體的,x改變*y也會改變,如果我下面的代碼改變了x,那*y也要變,可是*y不是收到了const的修飾不能變么,為什么合法0.0
2019-09-15
源自:C++遠(yuǎn)征之離港篇 3-1
正在回答
x將地址給了y,那么*y和x就是一體的,x改變*y也會改變,如果我下面的代碼改變了x,那*y也要變,可是*y不是收到了const的修飾不能變么
按照C指針的說法,第一句就是錯的,y是指向x的指針,和x不是一體的,x是變量,x不管怎么變,y指向的地址是不變的。
const int * y 就是指向只讀變量的指針,不能改變值,但是可以指向別人
*y是指向x的地址吧,加const表示指向的這個地址不變,所以不管x變化與否,*y還是指向x的地址,只是這個地址的值變了,因此*y的值變化,這是合法的。
根本原因是:因?yàn)?int x 在前, const int* y = &x 在后,原則上要求對 *y 的任何操作不能導(dǎo)致 x 有違規(guī)行為。
我們先看另外一個例子:
const?int?x=3;? int*?y=&x;
這里 *y 是個變量,是可讀可寫的,而對 *y 的寫入操作(即再次賦值)會改變 x 的值,但 x 已經(jīng)被聲明為常量,不能重新賦值,所以對 *y 重新賦值對于 x 來說是個違規(guī)操作。也就是說,對 *y 的某些操作有可能導(dǎo)致 x 有違規(guī)行為,所以無法通過編譯。
回到原問題,
int?x;?const? int?*y?=?&x;
這里,因?yàn)?*y 被聲明為一個常量,我們沒法直接對 *y 二次賦值,所以對 *y 的“任何操作”其實(shí)就只剩下一種操作,就是讀操作,即讀取 *y 的值。而這個操作是不會導(dǎo)致 x 有違規(guī)行為的,因?yàn)?x 是個變量,我們既能讀取它的值,又能改變它的值。所以對 *y 的任何操作不會導(dǎo)致 x 有違規(guī)行為,因此是合法的,可以通過編譯。
六個蒸蛋
一般來說都是變y吧
舉報
C++掃清通往面向?qū)ο蟮淖詈笠坏勒系K,將所有知識點(diǎn)融會貫通
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2020-12-23
x將地址給了y,那么*y和x就是一體的,x改變*y也會改變,如果我下面的代碼改變了x,那*y也要變,可是*y不是收到了const的修飾不能變么
按照C指針的說法,第一句就是錯的,y是指向x的指針,和x不是一體的,x是變量,x不管怎么變,y指向的地址是不變的。
const int * y 就是指向只讀變量的指針,不能改變值,但是可以指向別人
2019-12-02
*y是指向x的地址吧,加const表示指向的這個地址不變,所以不管x變化與否,*y還是指向x的地址,只是這個地址的值變了,因此*y的值變化,這是合法的。
2019-11-07
根本原因是:因?yàn)?int x 在前, const int* y = &x 在后,原則上要求對 *y 的任何操作不能導(dǎo)致 x 有違規(guī)行為。
我們先看另外一個例子:
這里 *y 是個變量,是可讀可寫的,而對 *y 的寫入操作(即再次賦值)會改變 x 的值,但 x 已經(jīng)被聲明為常量,不能重新賦值,所以對 *y 重新賦值對于 x 來說是個違規(guī)操作。也就是說,對 *y 的某些操作有可能導(dǎo)致 x 有違規(guī)行為,所以無法通過編譯。
回到原問題,
這里,因?yàn)?*y 被聲明為一個常量,我們沒法直接對 *y 二次賦值,所以對 *y 的“任何操作”其實(shí)就只剩下一種操作,就是讀操作,即讀取 *y 的值。而這個操作是不會導(dǎo)致 x 有違規(guī)行為的,因?yàn)?x 是個變量,我們既能讀取它的值,又能改變它的值。所以對 *y 的任何操作不會導(dǎo)致 x 有違規(guī)行為,因此是合法的,可以通過編譯。
2019-09-15
一般來說都是變y吧