c 中的const和volatile知識自我總結

2022-08-24 17:42:10 字數 1187 閱讀 8797

學習了下c++中的const關鍵字,總結如下。

1、const限制乙個變數不能修改其內容,如果強行修改的話,如下面**這樣子,編譯就會報錯,「表示式必須是可修改的左值」。

int main()

2、如果通過指標強行修改呢,如下面**這樣子。

int main()

編譯可以通過,但是輸出來之後可以看到a還是6,但是*p是12。

這是怎麼回事?p明明是指向變數a的乙個指標,怎麼會指標指向的記憶體空間儲存的變數的值已經修改了,但是輸出仍然是改變前的值?

筆者看了一些資料,【應該是】因為編譯器對於const型別的變數都不會二次讀取,只會在最開始的時候從記憶體中讀取一次,之後儲存在常量表中,之後需要用到就從常量表中取得。

所以即便指標指向的值已經修改過了,但是讀取仍然是改變前的值。

3、常量指標和指標常量

常量指標有兩種寫法,如下兩種。

const int *p1;

int const *p2;

這兩種都是說指標是個const int型別的指標,只不過const的位置比較飄忽,可以在int前面,也可以在int後面。

指標常量只有一種寫法,如下。

int a=2;

int* const p3=&a;

指標常量是int型別的指標,定義的時候必須初始化位址,因為指標常量不能被修改位址。

4、volatile是乙個指令關鍵字,也是用來修飾型別的,告訴編譯器這個變數是可變,不要對其進行優化。

通常來講,編譯器會對**進行優化,詳細解釋我覺得這篇部落格寫得很好,大家可以參考一下這一篇

總的來說,volatile可以確保每次使用變數的時候,都從記憶體中重新讀取,而不允許編譯器對這個變數的讀取操作進行優化。一般在多工環境下會用到這個關鍵字。

volatile的指標和const一樣,分兩種,見以下**。

volatile int *p1;//volatile int型別的指標,禁止編譯器優化指標指向的變數,但是可以優化指標本身位址

int volatile *p2;//同上,另一種寫法

int* volatile p3;//int型別的指標,禁止編譯器優化指標本身位址,但是可以優化指標指向的變數

以上,如有錯漏,還請指出~

C 中的頂層const和底層const

在c 中,頂層const可以表示任意的物件是常量,而底層const則是與指標,引用這樣的復合符合型別相聯絡。確切地說,在指標中,既有底層const之說,也有頂層const的說法。但在引用中就只有底層const,原因是頂層const表示任意的物件是常量,而引用不是物件。而在其他的型別 現的const一...

C 中頂層const和底層const

指標本身是乙個物件,由於,指標實際相應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個全然不同的概念,頂層 const 表示的是 指標本身是乙個常量,底層 const 表示的是 指標所指的物件是乙個常量,更普通情況下,頂層 const...

C 中頂層const和底層const

頂層const表示指標本身是個常量,底層const表示指標所指的物件是乙個常量。int i 0 int const p1 i 不能改變p的值,p是乙個指標,所以p是乙個頂層const const int p2 i 表示不能改變指標所指i的值,所以是乙個底層const const的頂層和底層不只是限定...