1簡介

局部變數,如不作專門說明為自動變數,都是動態分配存儲空間,存儲在動態存儲區中。這種變數叫自動變數。這種變數只在定義它們的時候才創建,在定義它們的函數返回時系統回收變數所佔存儲空間。對這些變數存儲空間的分配和回收是由系統自動完成的,所以也叫自動變數。一般情況下,不作專門說明的局部變數,均是自動變數。自動變數也可用關鍵字auto作出說明。例如:(考慮到瀏覽器可能給作者本意要寫在同一行的程序分行,作者只在本意要寫在同一行的程序末尾加了註釋。這個函數寫進程序沒用,只是在這裡舉例用)
void f()"
{"
auto int c=3;"
int x=2;"
}"
局部變數的生命期是從它們被定義直到定義它們的函數返回這段時間。

2區別

自動變數
什麼是自動變數呢?自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生衝突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回后,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
"
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d\n",var);
return 0;
}
int print()
{
auto int i=0; "
i+=1;
printf("%d\n",i);
return i;
}
"
靜態變數:
靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆棧機制來使用內存。而是為靜態變數分配固定的內存,在程序運行的整個過程中,它都會被保持,而不會不銷毀。這就是說靜態變數的持續性是程序運行的整個周期。這有利於我們共享一些數據。如果靜態變數在函數內部定義,則它的作用域就是在這個函數內部,僅在這個函數內部使用它才有效,但是它不同於自動變數的,自動變數離開函數后就會被銷毀,而靜態變數不會被銷毀。他在函數的整個運行周期內都會存在。在函數外面定義的變數為全局變數,工程內的所有文件都可以訪問他,但是它在整個工程內只能定義一次,不能有重複的定義,不然就會發生錯誤,而其他的文件要想使用這個變數,必須用extern來聲明這個變數,這個聲明叫做引用聲明。這一點很重要,如果你沒有用extern 來聲明在其他文件中已經定義的全局變數,就來使用它,就會發生錯誤如果你只是想在定義他的文件中使用它,而不允許在其他的文件中使用它,那麼就用關鍵字static來在函數外面聲明變數。這樣這個變數在其他文件中將不可見,即它的連接性而內部鏈接。有一點是我們只得注意的像:如果你在函數外這樣聲明一個變數,const int a ; 變數a的連接性為內部鏈接,只能在定義他的文件內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自動初始化為0;
"
#include <stdio.h>
int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d",var);
return 0;
}
int print()
{
static int i; "
i+=1;
printf("%d\n",i);
return i;
}
"
寄存器變數:
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能.但是寄存器變數不是強制性的,也就是,即使你使用register關鍵字去聲明一個變數為寄存器變數,編譯器還是有可能把它作為一個普通的變數而不是寄存器變數來使用的. 在我們寫程序的過程當中,有時候會經常用到一個全局變數,如果能夠把它作為寄存器變數來使用,顯然可以提高程序的性能,特別是對於那些對性能要求比較高的程序(比如模擬器,虛擬機等).拿X86平台來說,如果使用Gcc擴展,可以按照如下方式聲明一個全局寄存器變數,並指定它存入ebx寄存器:int ra asm("ebx");用作這種用途的還有「ebp, ebx, esi, edi".這時候需要在編譯程序的時候給出特別的選項,因為有些寄存器原本是另有用途的,比如ebp寄存器,原來是做frame-pointer用.
易失變數:
volatile:(嵌入式程序員必須掌握的)volatile最初的意思是表示汽油容易揮發,在c中的作用大概有兩點(1)表示變數是易失的,易變的. (2)強制訪存操作,防止編譯器去優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存.
上一篇[整型變數]    下一篇 [標準模塊]

相關評論

同義詞:暫無同義詞