告訴編譯器:該變量可能在「意想不到」的時刻發生變化(硬件、中斷、其他線程),每次讀取必須從內存重新加載,禁止優化器將其值缓存在寄存器中。
合法且常見。const 表示「代碼不應修改」,volatile 表示「硬件可能修改」。典型例子:只讀狀態寄存器 const volatile uint32_t *STATUS_REG。
volatile int *p:指向 volatile int 的指針(指針本身非 volatile)。
int *volatile p:指針本身是 volatile(指針值可能意外變化,如中斷修改緩衝區指針)。
int square(volatile int *ptr) {
return *ptr * *ptr; // 錯誤:兩次讀取可能得到不同值
}
修正:
int square(volatile int *ptr) {
int val = *ptr; // 單次讀取
return val * val;
}
編譯器對原代碼可能生成兩次加載指令,若 *ptr 為硬件計數器,兩次值不同導致非平方結果。