變數是 C 語言最基礎也最核心的概念,卻常被初學者誤解。本文從記憶體本質出發,系統梳理變數的時空特性、儲存區域劃分、四大儲存類別關鍵字,建立完整認知框架。
char c = 'x'; // ASCII 120
c 是記憶體位址 0x1101 的符號別名c 實質是訪問對應記憶體單元若不理解上述內容,請先補《計算機組成原理》——它是學習組合語言與 C 語言的先修課,大學課程順序顛倒誤導了無數學生。
| 維度 | 分類 | 關鍵字/特徵 |
|---|---|---|
| 空間(作用域) | 全域變數 | 函式外部定義,整個專案可見 |
| 區域變數 | 函式/區塊內部定義,僅區塊內可見 | |
| 時間(生命週期/儲存類型) | 靜態儲存 | 程式啟動分配,結束釋放,static、extern |
| 動態儲存 | 運行時分配/釋放,auto、register、malloc |
初學者常混淆「外部/全域」與「靜態/動態」——前者是作用域視角,後者是生命週期視角,兩個正交維度!
malloc/free 或 new/delete 管理。static 變數。程式啟動分配,結束釋放,全程存在。"hello"),唯讀,程式結束釋放。| 關鍵字 | 全稱 | 作用域 | 儲存類型 | 預設初值 | 特殊規則 |
|---|---|---|---|---|---|
auto | 自動變數 | 區域 | 動態(棧) | 無(隨機值) | 可省略,int a; 即為 auto int a; |
register | 暫存器變數 | 區域 | 動態(CPU 暫存器) | 無 | 不可取址 &;現代編譯器多忽略此提示,視同 auto |
extern | 外部變數 | 全域 | 靜態(全域區) | 0 | 聲明非定義;extern int a; 告訴編譯器「定義在別處」 |
static | 靜態變數 | 視定義位置而定 | 靜態(全域區) | 0 | 區域 static:保持值跨呼叫;全域 static:限制連結可見性(內部連結) |
extern(全域變數)也屬靜態儲存,但非 staticauto 為型別推導,C 語言仍保持原意| 宣告 | 儲存期 | 連結屬性 | 作用域 |
|---|---|---|---|
int a;(檔案頂層) | 靜態 | 外部連結 | 全域 |
static int a;(檔案頂層) | 靜態 | 內部連結 | 檔案內 |
extern int a; | 靜態 | 外部連結 | 全域(聲明) |
int a;(函式內) | 動態 | 無連結 | 區塊內 |
static int a;(函式內) | 靜態 | 無連結 | 區塊內 |
register int a; | 動態 | 無連結 | 區塊內 |
掌握 C 變數需建立三維認知:
這是從「會用」走向「懂原理」的關鍵門檻。
本文出自 “熔 巖” 博客,請務必保留此出處 https://lavasoft.blog.51cto.com/62575/186951