1. 程式人生 > >c語言 儲存型別

c語言 儲存型別

c中的每一個變數和函式都有兩個屬性:型別(type)和儲存型別(storage class).儲存型別分別是auto(自動),extern(外部),register(暫存器),static(靜態)
1.auto
在函式體中定義的變數預設是auto.
當進入程式碼塊(block)時,系統為自動變數分配記憶體.在塊內,這些變數被定義,並被認為他們是區域性於本塊的.當退出塊時,系統釋放分配給自動變數的記憶體,因此,變數值就丟失了.重新進入塊,系統會為自動變數再次分配記憶體,原先的值已經沒有了.
2.extern
在函式的外部宣告變數,就為變數永久的分配儲存,它的儲存型別是extern.
定義在函式外部的變數的儲存型別都是extern,既不使用關鍵字extern.
使用extern關鍵字是告訴,編譯器”在本檔案或其他檔案中尋找它”.既a檔案中int a =1

在b檔案中則可以使用extern int a;來呼叫它.
外部變數從不會消失,因為外部變數在整個程式執行期間都是存在的.
兩種方式向函式傳遞資訊:1.使用外部變數.2.使用引數.當函式從其內部而不是通過引數表改變全域性變數時,會產生副作用.這樣的構造容易引發錯誤.正確的做法是通過引數和返回機制影響全域性變數.

3.register
register高速編譯器應該把有關的變數儲存在高速的記憶體暫存器中.使用儲存於型別register是要試圖改善執行速度.當關系速度時,可選擇一些最經常訪問的變數,並把他們的儲存型別宣告為register.
register i;等價於register int i;

,register預設是int型別.

4.static
1.允許區域性變數儲存它的原有值,以便再進入塊時使用.

void f(void)
{
    static int cnt = 0;
}

當第一次呼叫函式時,把變數cnt初始化為0,在退出函式時,cnt的值被儲存在記憶體中.當再次呼叫函式時,就不用再對cnt進行初始化,cnt扔保留著上次呼叫函式時的值.
2.在函式外部宣告static,則次變數是本檔案可訪問(私有privacy),外部檔案不能訪問.