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


學習了下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類型的指針,禁止編譯器優化指針本身地址,但是可以優化指針指向的變量

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM