亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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++遠征之離港篇
  • 參與學習       122678    人
  • 解答問題       493    個

C++掃清通往面向對象的最后一道障礙,將所有知識點融會貫通

進入課程

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

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號