C語言變數類型
auto
static
external
static external
register
auto 局部變數
auto 變數是用堆棧(stack)方式佔用儲存器空間,因此,當執行此區段是,系統會立即為這個變數分配儲存空間空間,而程式執行完後,這個堆棧立即被系統收回.在大括弧{}內聲明.
自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是 局部變數,即它的地區性是在定義他的函數內部有效。當然這說明自動變數也沒有連結性,因為它也不允許其他的檔案訪問他。由於自動變數在定義他的函數的外面 的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生衝突的。因為他們都有自己的地區性, 而且它沒有連結性(即:不允許其他的檔案訪問他的)。來看看自動量的持久性。電腦在執行這個函數的時候,建立並為它分配記憶體,當函數執行完畢返回後,自 動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配記憶體就壓棧,而函數返回時就退棧。
static 靜態變數
static 變數是C程式編譯器以固定地址存放的變數,只要程式不結束,記憶體不被釋放.
靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆棧機制來使用記憶體。而是為靜態變數分配固定的記憶體,在程式啟動並執行整個過程中,它都會被 保持,而不會不銷毀。這就是說靜態變數的持久性是程式啟動並執行整個周期。這有利於我們共用一些資料。如果靜態變數在函數內部定義,則它的範圍就是在這個函 數內部,僅在這個函數內部使用它才有效,但是它不同於自動變數的,自動變數離開函數後就會別銷毀,而靜態變數不會被銷毀。他在函數的整個運行周期內都會存 在。在函數外面定義的變數為全域變數,工程內的所有檔案都可以訪問他,但是它在整個工程內只能定義一次,不能有重複的定義,不然就會發生錯誤,而其他的文 件要想使用這個變數,必須用extern來聲明這個變數,這個聲明叫做引用聲明。這一點很重要,如過你沒有用extern 來聲明在其他檔案中已經定義的全域變數,就來使用它,就會發生錯誤如果你只是想在定義他的檔案中使用它,而不允許在其他的檔案中使用它,那麼就用關鍵字 static來在函數外面聲明變數。這樣這個變數在其他檔案中將不可見,即它的串連性而內部連結。有一點是我們只得注意的像:如果你在函數外這樣聲明一個 變數,const int a ; 變數a的串連性為內部連結,只能在定義他的檔案內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自s動初始化為0;
external 變數
外部變數 定義在程式外部,所有的函數很程式段都可以使用.
外部變數可能會在某一程式段被重新定義,以段內變數為參考值.
static external 變數
靜態外部變數和外部變數差別在於,外部變數生命可以同時給多個檔案使用,而靜態外部變數則只能給聲明此變數的檔案使用.
register 變數
寄存器變數,是由寄存器分配空間,訪問速度比訪問記憶體快,加快執行速度.寄存器大小有限.
在c語言當中可以使用寄存器變數來最佳化程式的效能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了效能。但是寄存器變數不是強制性的,也就是說,即使你使用register關鍵字去聲明一個變數為寄存器變數,編譯器還是有可能把它作為一個普通的變數而不是寄存器變數來使用的。
需要注意的是,目前C編譯器還不允許全域寄存器變數,也就是說寄存器變數只能是局部變數或者函數形參變數,而且最好是int,char或者指標類型變數。在聲明寄存器變數的時候,可以制定使用哪個寄存器,在X86平台上常用的有”ebp, ebx, esi, edi“。 可以這樣聲明: register int local_var __asm__("ebp"); 這時候需要在編譯器的時候給出特別的選項,因為有些寄存器原本是另有用途的,比如ebp寄存器,原來是做frame-pointer用途的,在偵錯工具 的時候可以用它來跟蹤程式的調用關係。這時候我們使用 -fomit-frame-pointer 選項來指明這一點。