學習了下c++中的const關鍵字,總結如下。
1、const限制一個變量不能修改其內容,如果強行修改的話,如下面代碼這樣子,編譯就會報錯,“表達式必須是可修改的左值”。
int main()
{
const int a = 6;
cout << a << endl;
a = 10;
cout << a << endl;
return 0;
}
2、如果通過指針強行修改呢,如下面代碼這樣子。
int main()
{
const int a = 6;
cout << a << endl;
int *p = (int*)&a;
cout << p << endl;
cout << *p << endl;
*p = 12;
cout << *p << endl;
cout << a << endl;
}
編譯可以通過,但是輸出來之后可以看到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是一個指令關鍵字,也是用來修飾類型的,告訴編譯器這個變量是可變,不要對其進行優化。
通常來講,編譯器會對代碼進行優化,詳細解釋我覺得這篇博客寫得很好,大家可以參考一下這一篇https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html
總的來說,volatile可以確保每次使用變量的時候,都從內存中重新讀取,而不允許編譯器對這個變量的讀取操作進行優化。一般在多任務環境下會用到這個關鍵字。
volatile的指針和const一樣,分兩種,見以下代碼。
volatile int *p1;//volatile int類型的指針,禁止編譯器優化指針指向的變量,但是可以優化指針本身地址
int volatile *p2;//同上,另一種寫法
int* volatile p3;//int類型的指針,禁止編譯器優化指針本身地址,但是可以優化指針指向的變量
以上,如有錯漏,還請指出~