指向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 物件的指標.
指向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 物件的指標.
相關文章
- 指標與const指標
- const 變數和指標變數指標
- 常量引用或指向常量的指標,其所指物件可以是非const物件(C++)指標物件C++
- 02_const修飾指標指標
- C++中const與指標、引用的總結C++指標
- 函式呼叫時用const保護指標函式指標
- Go 陣列指標(指向陣列的指標)Go陣列指標
- 【C++系列】指標物件和物件指標的區別C++指標物件
- const修飾符的使用(修飾結構體指標,引用外部的const 變數)結構體指標變數
- 【原創】淺談指標(十三)指向陣列的指標指標陣列
- 詳解c++指標的指標和指標的引用C++指標
- 指向指標的常量引用瞭解指標
- 有關this指標指向問題指標
- 指標常量和常量指標的區別指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 2.3C++物件模型和this指標C++物件模型指標
- 指標函式 和 函式指標指標函式
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標
- 【C/C++】1.函式傳入指標加const的作用及用法區別C++函式指標
- jmeter軟體指標和硬體指標(16.5)JMeter指標
- 120 C++中的物件指標C++物件指標
- 指標和標籤的基礎理解指標
- ES6指北【1】——let、const
- 陣列指標,指標陣列陣列指標
- 1.0 - 指標和引用指標
- [C++] 成員函式指標和函式指標C++函式指標
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標
- 指標指標
- 智慧指標和普通指標的區別指標
- 指標陣列與陣列指標指標陣列
- 指標和引用的區別指標
- 指標陣列和陣列指標與二維陣列指標陣列
- C++ 中的 const 物件與 const 成員函式C++物件函式
- 不要輕易定義指向std::vector中的元素的指標指標
- 如何正確理解「指標」和「標籤」指標
- 指標的理解指標
- 指標的用法指標
- 第 10 節:複合型別-5. 指標 -- 指標與指標變數 -8. 多級指標型別指標變數
- 常資料成員的深複製,const+字元型指標 ,如何寫深複製的程式碼?字元指標