自動變數與非自動變數

2021-06-18 20:36:06 字數 2306 閱讀 9689

自動變數與非自動變數

2012-05-28 10:27:52

自動變數

區域性變數,如不作專門說明為靜態變數,都是動態分配儲存空間,儲存在動態儲存區中。這種變數叫自動變數。這種變數只在定義它們的時候才建立,在定義它們的函式返回時系統**變數所佔儲存空間。對這些變數儲存空間的分配和**是由系統自動完成的,所以也叫自動變數。一般情況下,不作專門說明的區域性變數,均是自動變數。自動變數也可用關鍵字auto作出說明。例如:(考慮到瀏覽器可能給作者本意要寫在同一行的程式分行,作者只在本意要寫在同一行的程式末尾加了注釋。這個函式寫程序式沒用,只是在這裡舉例用)  

void f()/**/  

/**/  

區域性變數的生命期是從它們被定義直到定義它們的函式返回這段時間。

自動、靜態、 暫存器、易失變數的區別

自動變數:什麼是自動變數呢?自動變數就是指在函式內部定義使用的變數。他只是允許在定義他的函式內部使用它。在函式外的其他任何地方都不能使用的變數。自動變數是區域性變數,即它的區域性是在定義他的函式內部有效。當然這說明自動變數也沒有鏈結性,因為它也不允許其他的檔案訪問他。由於自動變數在定義他的函式的外面的任何地方都是不可見的,所以允許我們在這個函式外的其他地方或者是其他的函式內部定義同名的變數,他們之間不會發生衝突的。因為他們都有自己的區域性,而且它沒有鏈結性(即:不允許其他的檔案訪問他的)。來看看自動量的持續性。計算機在執行這個函式的時候,建立並為它分配記憶體,當函式執行完畢返回後,自動變數就會被銷毀。這個過程是通過乙個堆疊的機制來實現的。為自動變數分配記憶體就壓棧,而函式返回時就退棧。  

/* auto */  

#include

int main() 

int print()  

/* end */  

靜態變數:靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆疊機制來使用記憶體。而是為靜態變數分配固定的記憶體,在程式執行的整個過程中,它都會被保持,而不會不銷毀。這就是說靜態變數的持續性是程式執行的整個週期。這有利於我們共享一些資料。如果靜態變數在函式內部定義,則它的作用域就是在這個函式內部,僅在這個函式內部使用它才有效,但是它不同於自動變數的,自動變數離開函式後就會別銷毀,而靜態變數不會被銷毀。他在函式的整個執行週期內都會存在。

在函式外面定義的變數為全域性變數,工程內的所有檔案都可以訪問他,但是它在整個工程內只能定義一次,不能有重複的定義,不然就會發生錯誤,而其他的檔案要想使用這個變數,必須用extern來宣告這個變數,這個宣告叫做引用宣告。這一點很重要,如過你沒有用extern 來宣告在其他檔案中已經定義的全域性變數,就來使用它,就會發生錯誤如果你只是想在定義他的檔案中使用它,而不允許在其他的檔案中使用它,那麼就用關鍵字 static來在函式外面宣告變數。這樣這個變數在其他檔案中將不可見,即它的連線性而內部鏈結。有一點是我們只得注意的像:如果你在函式外這樣宣告乙個變數,const int a ; 變數a的連線性為內部鏈結,只能在定義他的檔案內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自s動初始化為0;  

/* static */  

#include

int main()  

int print()  

/* end */  

暫存器變數:在c語言當中可以使用暫存器變數來優化程式的效能,最常見的是在乙個函式體當中,將乙個常用的變數宣告為暫存器變數: register int ra; 如果可能的話,編譯器就會為它分配乙個單獨的暫存器,在整個函式執行期間對這個變數的操作全都是對這個暫存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了效能.但是暫存器變數不是強制性的,也就是,即使你使用register關鍵字去宣告乙個變數為暫存器變數,編譯器還是有可能把它作為乙個普通的變數而不是暫存器變數來使用的. 在我們寫程式的過程當中,有時候會經常用到乙個全域性變數,如果能夠把它作為暫存器變數來使用,顯然可以提高程式的效能,特別是對於那些對效能要求比較高的程式(比如模擬器,虛擬機器等).拿x86平台來說,如果使用gcc擴充套件,可以按照如下方式宣告乙個全域性暫存器變數,並指定它存入ebx暫存器:int ra asm("ebx");用作這種用途的還有「ebp, ebx, esi, edi".這時候需要在編譯程式的時候給出特別的選項,因為有些暫存器原本是另有用途的,比如ebp暫存器,原來是做frame-pointer用.

易失變數:volatile:(嵌入式程式設計師必須掌握的)volatile最初的意思是表示汽油容易揮發,在c中的作用大概有兩點(1)表示變數是易失的,易變的. (2)強制訪存操作,防止編譯器去優化,告訴編譯器每次必須去記憶體中取值,而不是從暫存器或者快取.

非自動變數有兩種,一種是全域性變數,一種是靜態變數。

自動變數與非自動變數

自動變數 區域性變數,如不作專門說明為靜態變數,都是動態分配儲存空間,儲存在動態儲存區中。這種變數叫自動變數。這種變數只在定義它們的時候才建立,在定義它們的函式返回時系統 變數所佔儲存空間。對這些變數儲存空間的分配和 是由系統自動完成的,所以也叫自動變數。一般情況下,不作專門說明的區域性變數,均是自...

自動變數與非自動變數

自動變數 區域性變數 如不作專門說明為 靜態變數 都是動態分配儲存空間,儲存在動態儲存區中。這種變數叫自動變數。這種變數只在定義它們的時候才建立,在定義它們的 函式 返回時系統 變數所佔儲存空間。對這些變數儲存空間的分配和 是由系統自動完成的,所以也叫自動變數。一般情況下,不作專門說明的區域性變數,...

makefile自動變數

下面是所有的自動化變數及其說明 表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,就是匹配於 目標中模式定義的集合。僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果乙個目標是 foo.a bar.o 那麼,就是 bar.o 就是 foo.a 如果目標不是函式庫檔案 unix 下是...