摘自http://www.myexception.cn/cpp/1900041.html
const int *p 為什么可以不初始化?
c++ primer 5th
P53 寫道:const 對象一旦創建后其值就不能再改變,所以const對象必須初始化。
但在 P57 中練習2.28的第(e)題為什么判斷為合法呢?為什么可以不用初始化呢?
(e)const int *p; // legal. a pointer to const int
------解決思路----------------------
const int *p; // p是指針,指向const int類型數據
int * const p; // p是常指針,指向int類型數據
const int * const p; // p是常指針,指向const int類型數據
------解決思路----------------------
const 對象一旦創建后其值就不能再改變,所以const對象必須初始化。
LZ對於這句話中的const對象要弄清楚:
const int *p中,const對象是*p(即*p的值是只讀),而對於此句“const對象必須初始化”,一般用法中我們是要給指針p初始化,而不是給*p初始化。所以在此可以不初始化。即使在聲明是進行初始化(const int* p = 0x123456),也是在對指針p初始化,等價於如下一般用法:
對此的用法一般如下:
const int *p;
p = 0x123456;(此時是在給指針p賦值,而不是給*p賦值)
int* const p中,const對象是p,此時在指針p聲明時必須初始化。
一般用法:
int* const p = 0x123456;
------解決思路----------------------
遇到const修飾的指針,需要注意有兩種可能:
1、指針變量指向的值無法改變
2、指針變量本身無法改變
例如:
int a = 10;
const int *p;
p = &a;
*p = 3; // 錯誤,通過此指針改變指向的值
int b = 5;
p = &b; // 正確
int c = 10;
int * const p = &c;
*p = 5; // 正確
int d = 5;
p = &d; // 錯誤,指針變量不能改變
------解決思路----------------------
(1) int *p -- p是個非const指針,指向的對象是int;
(2) const int *p -- p是個非const指針,指向的對象是const int;
(3) int * const p -- p是個const指針,指向的對象是int;
(4) const int * const p -- p是個const指針,指向的對象是const int。
以上四個都是定義指針p,如果初始化是指初始化指針p,而不是它所指向的對象,由於(3)和(4)中指針p是const的,所以必須初始化。(1)和(2)中的指針p是非const的,可以不初始化。