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

C 語言關鍵字深度解析:const、static、extern、sizeof、volatile

     編輯:關於C

const:唯讀承諾而非常數

const 僅表示「透過此符號不可修改」,並非真正常數。編譯器將其置於唯讀區,但仍可透過指標繞過修改。

四大使用場景

場景語法範例語意
基本變數const int n = 10;n 唯讀,但 int a[n] 在 C89 非法(VLA 除外)
指標修飾const int *p / int *const p前者限制 *p,後者限制 p 本身
函數參數void foo(const int *arr)模擬傳值呼叫,承諾不修改實參資料
返回值const char *get()回傳指標指向的內容唯讀,防止呼叫端修改

指標宣告快速判讀法

沿 * 劃線:const 在左修飾指向物件,在右修飾指標本身。
int const *p ≡ const int *p(指向常整數)
int *const p(常指標)
const int *const p(常指標指向常整數)

static:儲存期與連結屬性的雙重控制

修飾變數

  • 檔案域:內部連結,僅本編譯單元可見,等同 static int x; 隱藏符號。
  • 區塊域:靜態儲存期,生命週期贏過整個程式,但作用域仍限於區塊內。

修飾函數

static void helper() 限制連結可見性,避免多檔案同名衝突,實現 C 語言層面的封裝。

extern:跨編譯單元共享符號

extern int g_var; 僅宣告,不定義(不配置儲存空間)。定義需在某一 .c 檔出現 int g_var = 0;。
關鍵區別:宣告可重複,定義全程僅一次。

sizeof:編譯期運算子

  • 運算對象為型別或運算式,不評估運算式副作用:sizeof(i++) 不會遞增 i。
  • 陣列參數退化為指標:void f(int a[10]) 內 sizeof(a) == sizeof(int*)。
  • 結構體對齊導致 sizeof ≥ 成員大小總和,#pragma pack(1) 可強制緊湊。

volatile:告訴編譯器「別優化我」

適用場景:

  1. 記憶體對映暫存器(硬體隨時變更)
  2. 中斷服務程式修改的共享變數
  3. 多執行緒共享旗標(配合原子操作或鎖)

經典優化錯誤範例

int square(volatile int *ptr) {
    return *ptr * *ptr;  // 若無 volatile,編譯器可能優化為讀一次、平方
}
// 正確寫法仍需 volatile,強制每次存取記憶體

綜合面試題快速參考

程式碼片段輸出/結果考點
char *p = "abc"; sizeof(p)4/8 (指標大小)字串常值 vs 指標
char a[] = "abc"; sizeof(a)4 (含 \0)陣列初始化
void f(int a[10]); sizeof(a) in f指標大小參數退化
struct {int a; char b;} s; sizeof(s)8 (對齊)結構體填充
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved