指向const物件的指標 和 const指標

GeekWay發表於2012-07-14

指向const物件指標 和 const指標


1.指向const物件的指標

指向const物件的指標是一個指標,但是不能通過它修改它指向的物件的值.

宣告方法:

const int *p ;

指向const物件的指標在初始化後不允許對它指向的物件的值進行修改.

const int int_n = 1 ;

const int *point_n = &int_n ;

*ponint_n = 2 ; //錯誤,指向 const 物件的指標在初始化後不允許對它指向的物件的值進行修改.

需要注意的地方:

(1)指向 const 物件的指標本身不是 const 型別,所以這個指標可以指向另一個 const 物件。

例:

const int int_n1 = 1 ;
const int int_n2 = 2 ;

const int *point_n ;

point_n = &int_n1 ; //使 point_n 指向 int_n1

point_n = &int_n2 ; //使 point_n 指向 int_n2

cout << *point_n << endl ;

(2)指向 const 物件的指標可以被賦予一個非 const 物件的地址,但是不能試圖通過此指標來修改該物件的值。這裡參考《C++primer》中的說法:“如果把 指向const物件的指標 理解為 ‘自以為指向const的指標’,這可能會對理解有所幫助。”

例:

int int_n = 1 ;

const int *point_n = &int_n ;

*point_n = 2 ; //錯誤,指向const物件的指標可以被賦予一個非 const 物件的地址,但是不能試圖通過此指標來修改該物件的值.

(3)把一個 const 物件的地址賦給一個非 const 物件的指標是錯誤的.

例:

const int_n = 1 ;

int *point_n = &int_n ; //錯誤,把一個 const 物件的地址賦給一個非 const 物件的指標是錯誤的.

(4)不能使用 void* 指標儲存 const 物件的地址,應該使用 const void* 指標儲存 const 物件的地址.

const int_n = 1 ;

void *point_n = &int_n ; //錯誤,不能使用 void* 指標儲存 const 物件的地址,應該使用 const void* 指標儲存 const 物件的地址.

const void *point_n = &int_n ; //正確

2.const 指標

const 指標就是一個指標,但是它本身是 const 型別的.所以它初始化後不能再改變它的指向,即不能讓它再指向一個新的物件.

宣告方法:

int *const point_n ; //指向非 const 物件的 const 指標
const int *const point_n ; //指向 const 物件的 const 指標

const 指標可以指向 const 物件和非 const 物件,但是兩者宣告方法不同.
const 指標指向 const 物件時,不可以利用它修改它所指向的物件的值.但是 const 指標指向非 const 物件時,可以利用它修改它所指向的物件的值.

例:

int int_n1 = 1 ;
int int_n2 = 1 ;

int *const point_p1 = &int_n1 ; //const 指標 point_p1 指向非 const 物件
const int *const point_p2 = &int_n2 ; //const 指標 point_p1 指向 const 物件

*point_p1 = 2 ; //正確, const 指標指向非 const 物件時,可以利用它修改它所指向的物件的值.
*point_p2 = 2 ; //錯誤, const 指標指向 const 物件時,不可以利用它修改它所指向的物件的值.

3.兩者的區分

其實要弄清以上兩者的區別,只要明確兩點:

(1)指標本身是 const 型還是非 const 型;

(2)指標所指向的物件是 const 型還是非 const 型.

如果指標名前緊鄰的關鍵字是 const,那麼它就是一個const指標.
如果宣告指標所指向的物件型別前有 const關鍵字,那麼它就是一個指向 const 物件的指標.

相關文章