C++中常量與指針的示例詳解
前言
和指針聯用有佷微妙的地方,之前一直佷暈,現在來繼續研究下。諸如以下:
int const; const int; const int* p; int const* p; int* const p; const int* const p;
const 是一種處理符號常量的方法,以 const 聲明的變量,一般首字母大寫,聲明之後無法被修改。相比於 define,const 會顯式的指定類型。除定義符號外,一般可用於函數聲明,表示函數不會修改任何值;用於參數,表示函數不會修改參數;甚至可以用於聲明數組的長度。
解讀
const默認作用於其左邊的東西。左邊沒東西的情況下,作用於其右邊的東西。1
- const int* p,隻有右邊有東西,修飾的為 int,所以數值不能被修改。在與 * 結合,意思是*p不能被修改,其它的都可以。即不可通過該指針改變其指向的內容,但可改變指針本身所指向的地址。
- int const* p,先作用於左側的 int 為 int const,在疊加上右側的 *,所以修飾的為 int* p,所以,*p不能被修改,其它的都可以。即不可通過該指針改變其指向的內容,但可改變指針本身所指向的地址。也就是,和上面的是一樣的。
- int* const p,左邊是 *,所以 const 作用於指針,指向一個 int 變量。即不可以修改 p,但可以修改 *p,即不可改變指向的地址。
- const int* const p,對於第一個 const,左邊沒東西,修飾右邊的 int,指向的值不能修改;對於第二個 const 修飾 *,指針不能修改。即不可改變指針本身所指向的地址,也不可通過指針改變其指向的內容。同 int const* const p。
- int const* const* p,第一個 const 修飾 int,第二個 const 修飾第一個 *,也就是,指向 const int* const p 的指針,最後一個 * 沒有被修飾,因此可以指向其它變量。int const* const* const 就不可以瞭。
- 之後再出現此類情況,也可以慢慢分析滿天飛的 const 和指針。
一些例子
為瞭更好的理解上述內容,這裡來舉一些例子。常見的一般有兩種選擇:
- 常指針指向一個變量,防止修改指針修改變量值
- 常指針指向一個常量
- 非常指針指向常量(錯誤)
先看第一種情況:解引用隻是取出指向內存區域的值,因此指向內存區域的值是可以直接修改的,但不能通過指針修改。
int main (){ int a{34}; const int *p = &a; // *p 為 const,不能被修改 // 錯誤 // *p ++; // p 指向的不是常量,因此,可以修改 a a ++; std::cout << *p << std::endl; int b{12}; p = &b; std::cout << *p << std::endl; return 0; }
對於第二種情況:不能修改變量,也不能修改常量。
int main (){ const int a{34}; // *p 為 const,不能被修改,a 也不能被修改 const int *p = &a; std::cout << *p << std::endl; int b{12}; p = &b; std::cout << *p << std::endl; return 0; }
對於第三種情況:修改指針來修改常量會顯得佷荒謬,因此編譯會直接報錯:
int main (){ const int a{34}; // error: invalid conversion from 'const int*' to 'int*' int *p = &a; *p ++; std::cout << *p ; return 0; }
二級指針
之前說到,常指針可以指向變量,但是涉及二級指針後,情況又會發生逆轉。
int main (){ const int a{12}; const int** p1; int* p2; // error: invalid conversion from 'int**' to 'const int**' p1 = &p2; *p1 = &a; *p2 = 10; return 0; }
如果上述代碼通過,那麼完全可以通過 p2 指針修改常量。因此我們可以得到以下結論:
若數據類型本身不是指針,可以將 const 數據或非 const 數據的地址賦給指向 const 的指針,但指針可以修改,指向別的值。因此,const 修飾的數組不能傳參給非常量指針。
如果數據類型是指針,非 const 數據的地址隻能賦值給非 const 指針,如二級指針中,p1 = &p2 是錯誤的。
總結
到此這篇關於C++中常量與指針的文章就介紹到這瞭,更多相關C++常量與指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
references
1.https://www.zhihu.com/question/443195492 ↩