
實際上每個具有識別字名稱的資料都屬於自動型或靜態型,兩種儲存類型之一。儲存類型指定詞有如下四種
auto |
register |
static |
extern |
宣告時理應加上儲存類型指定詞,形式如下

若是沒有加上儲存類型指定詞,編譯器一律視為 auto ,也就是自動型,宣告時會同時配置適當的記憶體空間,於函數內使用,離開建立自動型變數的函數,該自動型變數會消失。如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> void fun( void ); int main( void ) { int i = 55; printf ( "in main, i = %d\n" , i); i++; fun(); printf ( "in main, i = %d\n" , i); i++; fun(); return 0; } void fun( void ) { int i = 33; printf ( "in fun, i = %d\n" , i); i++; } /* 《程式語言教學誌》的範例程式 檔名:sc_test.c 功能:示範 auto 自動型變數的使用 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,如下

雖然 main() 與 fun() 都有相同名稱的變數 i ,但兩者互不影響,同時每一次呼叫 fun() , fun() 裡頭的變數 i 都會重新被設值為 33 。
宣告為 register 的變數,同樣屬於自動型,通常用於使用頻繁的控制變數,其為建議編譯器將此變數配置在暫存器中,以加快變數的存取。
static 與 extern 兩者為靜態型,宣告成 static 變數的特點是會保留其值,直到下次進入函數時仍以原先改變的值使用,如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> void fun( void ); int main( void ) { int i = 55; printf ( "in main, i = %d\n" , i); i++; fun(); printf ( "in main, i = %d\n" , i); i++; fun(); return 0; } void fun( void ) { static int i = 33; printf ( "in fun, i = %d\n" , i); i++; } /* 《程式語言教學誌》的範例程式 檔名:se_test2.c 功能:示範 static 靜態型變數的使用 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,如下

我們可以看到 main() 與 fun() 的變數 i 都隨呼叫改變其值。
extern 用為使用函數外部宣告的變數,如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <stdio.h> int i = 77; int main( void ) { int i = 55; printf ( "main中宣告的 i = %d\n" , i); i++; { extern int i; i++; printf ( "main外宣告的 i = %d\n" , i); } printf ( "main中宣告的 i = %d\n" , i); return 0; } /* 《程式語言教學誌》的範例程式 檔名:sc_test3.c 功能:示範 extern 靜態型變數的使用 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,如下

除了在函數外使用 extern ,不同檔案若需要使用相同名稱的變數也可利用 extern 宣告。
C 語言宣告另外可用型態修飾詞,請繼續參考儲存類型外的修飾。
沒有留言:
張貼留言