
- C 程式設計教程
- C - 首頁
- C 語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境設定
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C 語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C 語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof 運算子
- C - 運算子優先順序
- C - 其他運算子
- C 語言中的決策
- C - 決策
- C - if 語句
- C - if...else 語句
- C - 巢狀 if 語句
- C - switch 語句
- C - 巢狀 switch 語句
- C 語言中的迴圈
- C - 迴圈
- C - while 迴圈
- C - for 迴圈
- C - do...while 迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break 語句
- C - continue 語句
- C - goto 語句
- C 語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C 語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C 語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C 語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void 指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C 語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C 語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點 (.) 運算子
- C - 列舉 (或 enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C 語言中的檔案處理
- C - 輸入 & 輸出
- C - 檔案 I/O (檔案處理)
- C 預處理器
- C - 預處理器
- C - 編譯指示
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C 語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static 關鍵字
- C - 隨機數生成
- C - 命令列引數
- C 程式設計資源
- C - 問題 & 答案
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C 語言中的儲存類
C 儲存類定義了 C 程式中變數和/或函式的作用域(可見性)和生命週期。它們位於要修改的型別之前。
在 C 程式中,我們有四種不同的儲存類 -
- auto
- register
- static
- extern
auto 儲存類
auto 是在函式或程式碼塊內部宣告的所有變數的預設儲存類。可選的關鍵字“auto”可用於定義區域性變數。
auto 變數的作用域和生命週期在其宣告的同一程式碼塊內。
auto 儲存類的示例
以下程式碼語句演示了自動 (auto) 變數的宣告 -
{ int mount; auto int month; }
上面的示例在同一個儲存類中定義了兩個變數。'auto' 只能在函式內部使用,即區域性變數。
register 儲存類
register 儲存類用於定義應儲存在暫存器而不是 RAM 中的區域性變數。這意味著變數的最大大小等於暫存器大小(通常是一個字),並且不能對其應用一元“&”運算子(因為它沒有記憶體位置)。
register 應僅用於需要快速訪問的變數,例如計數器。還應注意,定義“register”並不意味著變數將儲存在暫存器中。這意味著它可能會儲存在暫存器中,具體取決於硬體和實現限制。
register 儲存類的示例
以下程式碼語句演示了暫存器變數的宣告 -
{ register int miles; }
static 儲存類
static 儲存類指示編譯器在程式的生命週期內保持區域性變數的存在,而不是在每次進入和退出作用域時建立和銷燬它。因此,使區域性變數成為靜態變數允許它們在函式呼叫之間保持其值。
static 修飾符也可以應用於全域性變數。這樣做會導致該變數的作用域限制在其宣告的檔案中。
在 C 程式設計中,當在全域性變數上使用static時,它會導致其類的所有物件共享該成員的一個副本。
static 儲存類的示例
以下示例演示了在 C 程式中使用 static 儲存類 -
#include <stdio.h> /* function declaration */ void func(void); static int count = 5; /* global variable */ main(){ while(count--) { func(); } return 0; } /* function definition */ void func(void) { static int i = 5; /* local static variable */ i++; printf("i is %d and count is %d\n", i, count); }
輸出
當編譯並執行上述程式碼時,它會產生以下結果 -
i is 6 and count is 4 i is 7 and count is 3 i is 8 and count is 2 i is 9 and count is 1 i is 10 and count is 0
extern 儲存類
extern 儲存類用於提供對所有程式檔案可見的全域性變數的引用。當使用“extern”時,變數不能初始化,但它會將變數名稱指向之前定義的儲存位置。
當您有多個檔案並且您定義了一個全域性變數或函式,該變數或函式也將在其他檔案中使用時,則將在另一個檔案中使用extern來提供已定義變數或函式的引用。為了理解,extern用於在另一個檔案中宣告全域性變數或函式。
extern 修飾符最常用於兩個或多個檔案共享相同的全域性變數或函式,如下所述。
extern 儲存類的示例
extern 儲存類的示例可能包含兩個或多個檔案。以下是一個演示在 C 語言中使用 extern 儲存類的示例 -
第一個檔案:main.c
#include <stdio.h> int count; extern void write_extern(); main(){ count = 5; write_extern(); }
第二個檔案:support.c
#include <stdio.h> extern int count; void write_extern(void) { printf("Count is %d\n", count); }
在這裡,extern用於在第二個檔案中宣告count,而它在第一個檔案(main.c)中定義。現在,編譯這兩個檔案,如下所示 -
$gcc main.c support.c
它將生成可執行程式a.out。當執行此程式時,它將產生以下輸出 -
Count is 5
儲存類的使用
儲存類用於定義變數的作用域、可見性、生命週期和初始(預設)值。
儲存類的總結
下表總結了具有不同儲存類的變數的作用域、預設值和生命週期 -
儲存類 | 名稱 | 記憶體 | 作用域,預設值 | 生命週期 |
---|---|---|---|---|
auto | 自動 | 內部記憶體 | 區域性作用域,垃圾值 | 在其宣告的同一函式或程式碼塊內。 |
register | 暫存器 | 暫存器 | 區域性作用域,0 | 在其宣告的同一函式或程式碼塊內。 |
static | 靜態 | 內部記憶體 | 區域性作用域,0 | 在程式內,即只要程式正在執行。 |
extern | 外部 | 內部記憶體 | 全域性作用域,0 | 在程式內,即只要程式正在執行。 |