關于 const int *p=&x;的問題
const int *p=&x;
關于這個老師給的講解是,p可以指向其他位置,但是*p的值是不能變的。
那么對于如下代碼
int main(void)
{
?????int x = 10 , y = 20;
?????const int *p = &x;
?????cout << *p << endl;
?????p = &y;
???? cout << *p << endl;
?????system("pause");
?????return 0;
}
輸出的兩次*p的值分別是10和20,那么這在間接程度上改變了*p的值,不與【*p值不變】這樣的設定相違背嗎》
2015-06-24
準確地表達應該是:p是一個指向const int型變量的指針,所以p無法修改其指向的int對象。但p本身不是const的,所以能被改變(也就是可以指向別的int)。*p是解引用p以得到p指向的對象。
代碼中第一個*p得到x,但只是用來讀取x的值,并沒有修改x的內(nèi)容。然后代碼將y的地址賦予了p,再次*p時就得到了y,同樣代碼中也沒有更改y的內(nèi)容,所以說沒有改變*p的值。 ?那個講解只說“*p”容易會引起理解上的歧義。
還應該注意到一點:p是一個指向const int的指針,說明p可以指向const int對象,也可以指向普通的int對象。只不過通過p來訪問指向的int對象時,編譯器會將這個對象當作const對象(因為p類型本身就是指向const對象的),你無法修改它的內(nèi)容。?示例中的就是這種情況,x和y都是普通的int,但*p無法更改它們的內(nèi)容。
2015-06-23
首先這里const修飾的是只讀變量而非常量,也就是說本質(zhì)上還是一個變量。
這里*p是只讀變量,無法直接賦值改變,但p所指向的內(nèi)存地址是可變的,所以可以通過改變p指向的地址來改變*p的值,但不能直接給*p賦值來改變。貌似不矛盾吧。