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

C語言基礎教程(二):變量聲明、作用域與存儲類別

     編輯:C 語言基礎

變量聲明語法


類型 <變量列表>;
  • 類型為合法數據類型,變量列表用逗號分隔。
  • 示例: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 只聲明不定義,配合多文件編譯實現模塊化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved