1. 程式人生 > >C語言的五種儲存類

C語言的五種儲存類

五種儲存類

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是變數