一、const 修飾變量
- 本質:只讀變量,仍佔用內存,有地址。
- 編譯期檢查寫操作,運行期無約束力(可通過指標修改)。

二、const 修飾數組
const int A[5] = {1,2,3,4,5};
int *p = (int*)A; // 去除 const 警告
p[0] = 10; // 運行期可修改,但屬未定義行為
三、const 修飾指標(左數右指口訣)
| 聲明 | 含義 | 口訣解析 |
const int *p; | 指向常量的指標(p 可變,*p 不可變) | const 在 * 左 → 修飾指向內容 |
int const *p; | 同上 | 同上 |
int *const p; | 常量指標(p 不可變,*p 可變) | const 在 * 右 → 修飾指標本身 |
const int *const p; | 指向常量的常量指標(雙不可變) | 左右各一個 const |
四、const 修飾函數參數與返回值
- 參數:
void func(const int *p) 承諾函數內不修改 *p。
- 返回值:
const int* func() 返回指向常量的指標,防止調用者修改內部靜態數據。
五、volatile 關鍵字
- 含義:告訴編譯器「每次必須從內存讀取,不可優化」。
- 適用場景:
- 多執行緒共享變量。
- 硬體寄存器/記憶體映射 I/O。
- 信號處理器中修改的變量。
- 可能被未知因素(DMA、中斷)修改的變量。
六、volatile 防優化示例
int obj = 10;
int a = obj;
sleep(100);
int b = obj; // 編譯器優化:直接用 10,忽略 obj 可能被外部修改
volatile int obj = 10; // 強制每次讀取內存
int a = obj;
sleep(100);
int b = obj; // 重新讀取 obj
七、const volatile 組合
const volatile int status = 0;
// 編譯器不允許代碼修改 status,且不優化讀取(每次從內存取)
// 適用於只讀硬體狀態寄存器
總結
const:語義約束(只讀),服務於編譯器類型檢查與代碼意圖表達。
volatile:優化屏障,服務於硬體/併發場景下的內存可見性。
- 兩者可組合,針對「只讀且易變」的硬體寄存器。