首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C語言 const 與 volatile 關鍵字深度解析

     編輯:C 語言入門

一、const 修飾變量

  • 本質:只讀變量,仍佔用內存,有地址。
  • 編譯期檢查寫操作,運行期無約束力(可通過指標修改)。
  • 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:優化屏障,服務於硬體/併發場景下的內存可見性。
  • 兩者可組合,針對「只讀且易變」的硬體寄存器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved