變量聲明語法
類型 <變量列表>;
- 類型為合法數據類型,變量列表用逗號分隔。
- 示例:
int i, j, k;、unsigned char c, str[5], *p;
變量三大類別(按聲明位置)
| 類別 | 聲明位置 | 別名 | 生命周期 | 作用域 | 默認初始化 |
| 局部變量 | 函數內部/復合語句 | 自動變量 (auto) | 函數調用期間 | 塊級作用域 | 無 (垃圾值) |
| 形式參數 | 函數參數列表 | — | 函數調用期間 | 函數內部 | 由調用者傳入 |
| 全局變量 | 所有函數外部 | 外部變量 | 程序整個運行期 | 全文件 (可跨文件) | 自動清零 |
局部變量
void foo() {
int x = 10; // 每次調用重新創建、初始化
// auto int x; // auto 可省略,從不顯式寫
}
- 調用時創建,返回時銷毀,不保持值。
- 未初始化值不確定,必須顯式賦值。
形式參數
void puthz(int x, int y, int color, char *p) {
int i, j, k; // 局部變量
// x,y,color,p 直接可用,無需再聲明
}
全局變量
#include
int g_val = 5; // 全局變量,文件頂部
void f1(int x, float y) {
float z = x * y;
g_val += z; // 修改全局變量
}
void f2() {
int cnt = 10;
g_val *= cnt;
}
int main() {
f1(20, 5.5); // g_val = 5 + 110 = 115
f2(); // g_val = 115 * 10 = 1150
return 0;
}
- 程序啟動時創建,退出時銷毀,自動初始化為 0。
- 可被任意函數訪問/修改,作為模塊間通信手段。
- 濫用導致耦合度高、難維護、名字空間汙染。
四種存儲類別
| 類別 | 關鍵字 | 適用對象 | 特性 |
| 自動 | auto | 局部變量、參數 | 默認,棧分配,調用創建/銷毀,不初始化 |
| 靜態 | static | 局部/全局 | 靜態區分配,程序全期存在,初始化一次,默認 0 |
| 外部 | extern | 全局變量聲明 | 跨文件引用全局變量,不分配內存 |
| 寄存器 | register | 局部 int/char、參數 | 請求 CPU 寄存器存儲,極快,僅限 2 個,無地址 |
static 詳解
- 靜態局部變量:函數內
static int x;。函數退出保持值,下次調用繼續使用。僅在函數內可見。
- 靜態全局變量:文件頂部
static int x;。僅在本源文件可見,其他文件 extern 也不可見。實現文件級封裝。
extern 跨文件示例
// file1.c
int g_x = 10, g_y = 20;
char g_c = 'A';
void func1(int k);
// file2.c
extern int g_x, g_y;
extern char g_c;
void func2() { g_x = g_y * 5; }
// 編譯鏈接:建立 .prj 文件列出所有 .c,IDE 統一編譯鏈接
register 使用建議
- 僅用於頻繁訪問的局部整型/字符變量(如循環計數器)。
- 超過 2 個編譯器自動降級為
auto。
- 不可取地址
®_var 錯誤。
總結
- 變量三類:局部(棧/無初始化)、參數(棚/傳入值)、全局(靜態區/自動清零)。
- 存儲類別:
auto(默認)、static(持久/文件封裝)、extern(跨文件引用)、register(寄存器加速)。
static 雙重語義:局部靜態(保持值) vs 全局靜態(文件私有)。
extern 只聲明不定義,配合多文件編譯實現模塊化。