一、const和volatile分析
1、const修飾變量
# 在c語言中const修飾的變量時只讀的,其本質還是變量
# const修飾的變量會在內存占用空間
# 本質上const只對編譯器有用,在運行時無用
原來const不是真的常量
2、const修飾數組
# 在C語言中const修飾的數組是只讀的
#const修飾的數組空間不可以被改變
const int A[5] = {1, 2, 3, 4, 5}
int *p = (int *)A;
int i = 0;
for(i=0; i<5; i++)
{
p[i] = 5-i;//報錯
}
3、const修飾指針
# const int *p; //p可變,p指向的內容不可變
# int const *p; //p可變,p指向的內容不可變
# int *const p; //p不可變,p指向的內容可變
# const int *const p; //p不可變, p指向的內容不可變
口訣:左數右指
當const出現在*號左邊時指針指向的數據為常量,當const出現在*後右邊時指針本身為常量
const修飾函數參數和返回值
# const修飾函數參數表示在函數體內不希望改變參數的值
# const修飾函數返回值表示返回值不可改變,多用於返回指針的情形
const int * func()
{
static int count = 0;
count++
return &count;
}
深藏不漏的volatile
1、volatile可理解為“編譯器警告指示字”
2、volatile用於告訴編譯器必須每次去內存中去取變量值
3、volatile主要修飾可能被多個線程訪問的變量
4、volatile也可以修飾可能被未知因數改變的變量
int obj = 10;
int a = 0;
int b = 0;
a = obj;
sleep(100);
b = obj;
以上代碼,編譯器在編譯的時候發現obj沒有被當成左值使用,因此會“聰明”的直接將obj替換成10,而把a和b都賦值為10.
課後思考
# const和volatile是否可以同時修飾一個變量?
# const volatile int i = 0; 這個時候i具有什麼屬性?編譯器如果處理這個變量?
答:可以。這個時候i具有const和volatile的雙重屬性。i變量不可以在編譯過程中被程序代碼修改,同時編譯器不得對i進行優化編譯。