C語言中有5個關於存儲類說明符的關鍵字,它們是auto、register、static、extern以及typedef。關鍵字typedef與內存存儲無關,因爲語法緣由被納入此類。特別地,不能夠在一個聲明中使用一個以上存儲類說明符,這意味着不能將其餘任一存儲類說明符做爲typedef的一部分。小程序
說明符auto代表一個變量具備自動存儲時期。該說明符只能用在具備代碼塊做用域的變量聲明中,而這樣的變量已經擁有自動存儲時期,所以它主要用來明確指出意圖,使程序更易讀。函數
說明符register也只能用於具備代碼塊做用域的變量。它將一個變量納入寄存器存儲類,這至關於請求將該 變量存儲在一個寄存器內,以更快地存取。它的使用也使您不能得到變量的地址。oop
說明符static在用於具備代碼塊做用域的變量的聲明時,使該變量具備靜態存儲時期,從而得以在程序運行期間(即便在包含該變量的代碼塊並無運行時)存在並保留其值。變量仍具備代碼塊做用域和空連接。static在用於具備文件做用域的變量的聲明時,代表該變量具備內部連接。ui
說明符extern代表您在聲明一個已經在別處定義了的變量。若是包含extern的聲明具備文件做用域,所指向的變量必然具備外部連接。若是包含extern的聲明具備代碼塊做用域,所指向的變量可能具備外部連接也可能具備內部連接,這取決於該變量的定義聲明。設計
下面給出了一個使用所有5種存儲類的小程序。它由兩個文件組成,所以您須要多文件編譯。程序的主要目的是使用所有5種存儲類,並不是提供一個設計範例;更好的設計將不須要文件做用域變量。code
程序清單12.5 parta.c文件內存
//parta.c --各類存儲類 #include <stdio.h> void report_count(); void accumulate(int k); int count = 0; //文件做用域,外部連接 int main(void) { int value; //自動變量 register int i; //寄存器變量 printf("Enter a positive integer(0 to quit): "); while(scanf("%d",&value) == 1 && value > 0) { ++count; //使用文件做用域變量 for (i=value;i>=0;i--) accumulate(i); printf("Enter a positive integer(0 to quit): "); } report_count(); return 0; } void report_count() { printf("Loop executed %d times\n",count); }
程序清單12.6 partb.c 文件作用域
#include <stdio.h> extern int count; //引用聲明,外部連接 static int total = 0; //靜態定義,內部連接 void accumulate(int k) //原型 void accumulate(int k) //k具備代碼塊做用域,空連接 { static int subtotal = 0; //靜態,空連接 if(k<=0) { printf("loop cycle: %d\n",count); printf("subtotal: %d;total: %d\n",subtotal,total); subtotal = 0; } else { subtotal += k; total += k; } }
在該程序中,具備代碼塊做用域的靜態變量subtotal保存運行時傳遞給函數accumulate()的數值的部分和具備文件做用域、內部連接的變量total保存運行時的總和。一量有非正數傳入,函數accumulate()就報告total和subtotal的值;並在報告時將subtotal重置爲0。parta.c中的函數accumulate()函數原型是必須的,由於函數包含一個accumulate()函數調用。對於partb.c來講,函數原型是可選的,由於這個函數雖然定義了,可是並無在該文件中被調用。函數同時使用外部變量count來記錄main()中的while循環執行了多少次(順便提一下,這是一個什麼狀況下不該使用外部變量的反而例子,由於它使parta.c和partb.c的代碼沒必要要地糾纏在了一塊兒)。在parta.c中,main()和report_count()共享count。原型
下面是一個運行示例:it
Enter a positive integer (0 to quit): 5 loop cycle: 1 subtotal: 15; total: 15 Enter a positive integer (0 to quit): 10 loop cycle: 2 subtotal: 55; total: 70 Enter a positive integer (0 to quit): 2 loop cycle: 3 subtotal: 3; total: 73 Enter a positive integer (0 to quit): 0 loop executed 3 times