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 選項來指明這一點。