const 修飾的變數是唯讀的,其本質仍是變數。const 修飾的變數會在記憶體佔用空間。const 僅對編譯器有效,執行時期無作用。const 不是真正的常數。
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; // 編譯報錯
}
const int *p; // p 可變,p 指向的內容不可變int const *p; // 同上int *const p; // p 不可變,p 指向的內容可變const int *const p; // p 不可變,p 指向的內容也不可變口訣:左數右指。當 const 出現在 * 號左邊時,指標指向的資料為常量;當 const 出現在 * 號右邊時,指標本身為常量。
const 修飾函數參數表示在函數體內不希望改變參數的值。const 修飾函數返回值表示返回值不可改變,多用於返回指標的情形。const int * func() {
static int count = 0;
count++;
return &count;
}
volatile 可理解為「編譯器警告指示字」。int obj = 10; int a = 0; int b = 0; a = obj; sleep(100); b = obj;
上述代碼中,編譯器發現 obj 未被當作左值使用,會「聰明」地直接將 obj 替換為 10,導致 a 和 b 都被賦值為 10。若加上 volatile,編譯器將不再優化,每次都從記憶體讀取最新值。
const 和 volatile 是否可以同時修飾一個變數?
const volatile int i = 0;
答:可以。此時 i 具備 const 和 volatile 的雙重屬性:變數不可在編譯過程中被程式碼修改,同時編譯器不得對 i 進行優化編譯。