C語言存儲分類
在C程序存儲類定義範圍(可見度)和變量和/或函數生命周期內。這些修飾符先於它們修改類型。有下列存儲類,它可以在C程序中使用:
-
auto
-
register
-
static
-
extern
自動存儲類
自動(auto)存儲類是所有局部變量的默認的存儲類彆。
{ int mount; auto int month; }
上麵的例子中定義了兩個變量具有相同的存儲類,auto隻能在函數中使用,也就是說,局部變量。
寄存器存儲類
寄存器存儲用於定義應當被存儲在寄存器中,而不是RAM中的局部變量。這意味著該變量等於寄存器大小(通常為一個字)的最大容量,並且可以不具有適用於它的一元'&'操作(因為它不具有一個存儲器位置)。
{ register int miles; }
寄存器應隻用於需要快速訪問諸如計數器變量。還應當指出的是界定“register”並不意味著該變量將被存儲在一個寄存器中。這意味著,它可能被存儲在寄存器依賴於硬件和執行的限製。
靜態存儲類
靜態存儲類指示編譯器在程序而不是創建在每次進入和超出範圍時銷毀它的生命周期內,以保持局部變量存在。因此,使得局部變量靜態使它們能夠保持函數調用之間的值。
靜態修辭符也可以應用於全局變量。當這樣做時,它會導致該變量的範圍被限製在其所聲明的文件。
在C語言編程,靜態時使用一個類的數據成員,它會導致該成員隻有一個拷貝到其類的所有對象共享。
#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 ", 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修飾符是最常用的,當存在兩個或多個文件,如下所述共用同一全局變量或函數。
第一個文件: 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 ", count); }
這裡,extern關鍵字被用於在第二文件中聲明的計數,其中,因為它有其在所述第一文件,在main.c中定義。現在,如下編譯這兩個文件:
$gcc main.c support.c
這將產生 a.out 可執行程序,當執行該程序時,它產生了以下結果:
5