C語言的五種儲存類
阿新 • • 發佈:2018-12-11
五種儲存類
C Primer Plus 第十二章 儲存類、連結和記憶體管理
儲存類 | 時期 | 作用域 | 連結 | 宣告方式 |
---|---|---|---|---|
自動 | 自動 | 程式碼塊 | 空 | 程式碼塊內 |
暫存器 | 自動 | 程式碼塊 | 空 | 程式碼塊內,使用關鍵字register |
具有外部連線的靜態 | 靜態 | 檔案 | 外部 | 所有函式之外 |
具有內部連線的靜態 | 靜態 | 檔案 | 內部 | 所有函式之外,使用關鍵字static |
空連線的靜態 | 靜態 | 程式碼塊 | 空 | 程式碼塊內,使用關鍵字static |
自動變數
自動變數n,m,i
int loop(int n)
{
int m; // m 的作用域
scanf("%d", &m);
{
int i; // m 和 i 的作用域
for (i = m; i < n; i++)
puts ("i is local to a sub-block\n");
}
return m; // m 的作用域, i 已經消失
}
暫存器變數
這裡寫程式碼片
具有外部連結的靜態變數
int Errupt; /* 外部定義的變數 */
double Up[100]; /* 外部定義的陣列 */
extern char Coal; /* 如果Coal被定義在另一個檔案, */
/*則必須這樣宣告*/
void next(void);
int main(void)
{
extern int Errupt; /* 可選的宣告*/ //引用宣告
extern double Up[]; /* 可選的宣告*/
...
}
void next(void)
{
...
}
具有內部連結的靜態變數
int traveler = 1; // 外部連結
static int stayhome = 1; // 內部連結
int main()
{
extern int traveler; // 使用定義在別處的 traveler
extern int stayhome; // 使用定義在別處的 stayhome
...
具有程式碼塊作用域的靜態變數
區域性靜態變數stay
/* loc_stat.c -- 使用區域性靜態變數 */
#include <stdio.h>
void trystat(void);
int main(void)
{
int count;
for (count = 1; count <= 3; count++)
{
printf("Here comes iteration %d:\n", count);
trystat();
}
return 0;
}
void trystat(void)
{
int fade = 1;
static int stay = 1;
printf("fade = %d and stay = %d\n", fade++, stay++);
}
注意, trystat()函式先列印再遞增變數的值。
該程式的輸出如下:
Here comes iteration 1:
fade = 1 and stay = 1
Here comes iteration 2:
fade = 1 and stay = 2
Here comes iteration 3:
fade = 1 and stay = 3
注
自動變數:如果未初始化外部變數,別指望這個值是0。可以用非常量表達式 初始化自動變數
int rance = 5 * ruth; // 使用之前定義的變數
外部變數:如果未初始化外部變數, 它們會被自動初始化為 0。與自動變數的情況不同, 只能使用常量表
達式初始化檔案作用域變數
int x = 10; // 沒問題, 10是常量
int y = 3 + 20; // 沒問題, 用於初始化的是常量表達
式
size_t z = sizeof(int); //沒問題, 用於初始化的是常量表達式
int x2 = 2 * x; // 不行, x是變數