c語言中對變數的說明包括兩方面的內容:變數型別以及變數的儲存型別。變數型別如:int(整形),char(字元型)是用來說明變數所占用的記憶體空間的大小。變數儲存型別用來說明變數的作用範圍。
c語言的變數儲存型別有:自動類、暫存器類、靜態類和外部類。
區域性變數是指在函式內部說明的變數(有時也稱為自動變數),用關鍵字auto進行說明。 所有的非全程變數都被認為是區域性變數,所以auto實際上從來不用。區域性變數在函式呼叫時自動產生,但不會自動初始化, 隨函式呼叫的結束,這個變數也就自動消失了,下次呼叫此函式時再自動產生,還要重新賦值,退出時又自動消失。
靜態變數用關鍵字static宣告。根據變數的型別可以分為靜態區域性變數和靜態全程變數。
(1)靜態區域性變數
它與區域性變數的區別在於:在函式退出時,這個變數始終存在,但不能被其它函式使用,當再次進入該函式時,將儲存上次的結果。其它與區域性變數一樣。
(2)靜態全程變數
靜態全程變數就是指只在定義它的原始檔中可見而在其它原始檔中不可見的變數。它與全程變數的區別是:全程變數可以再說明為外部變數(extern),被其它原始檔使用,而靜態全程變數卻不能再被說明為外部的,即只能被所在的原始檔使用。
外部變數用關鍵字extern宣告。為了使變數除了在定義它的原始檔中可以使用外,還可以被其它檔案使用,就要將全程變數通知每乙個程式模組檔案,此時可用 extern來說明。
暫存器變數通常在比較注重在執行速度的情況下使用。其思想是告訴編譯程式把該變數放在某個cpu暫存器中。因為資料在暫存器中操作比在記憶體中快,這樣就提高了程式**的執行速度。暫存器變數的說明是在變數名及型別之前加上關鍵字register。值得注意的是取位址運算子&不能作用於暫存器變數。
下面結合具體**來分析一下變數的種類。
file1.c #include #include int reset(); int next(); int last(); int sum(int ); int i=1; void main() }
file2.c檔案 static int i=10; int next() int last() int sum(int i) file3.c檔案 extern int i;
reset()
在file1.c的開頭宣告i是全程變數,並初始化為1。而在main函式內部,說明了兩個自動變數i和j,這樣在main內部出現的i就是自動變數。
在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同乙個變數,所以reset的值返回的就是這個i的當前值1。
file2.c檔案一開始就定義了變數i,並宣告為靜態變數,因此它的使用範圍只在當前檔案中使用。然而從函式sum中定義來看,其內部用到的i是形式引數,j是內部靜態變數,它們與以前的i, j都不同。
具體執行過程分析如下:
(1)首先程式經過編譯後生成可執行檔案,執行可執行檔案後,函式從main函式體進入,在初始化的過程中得到i為全域性變數,初值為1。
(2)進入main函式後首先呼叫函式reset(),進入檔案file3.c,檔案file3.c宣告i為外部變數,所以此時i的值為1,則返回的值為1。函式reset()執行完後返回主函式,繼續執行迴圈體中的程式。
(3)迴圈體首先呼叫函式next(),程式進入file2.c檔案,判斷i為靜態變數,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當呼叫last()函式時,判斷i的值為11,執行函式後,i的值變為10,並將10作為i的值。最後執行函式sum(i),此時值的注意的是執行程式時傳遞的是形參,即第一次呼叫時實際計算的值為sum(i+j=2),這樣呼叫函式sum(i)後執行的結果為i=5+2=7,即為執行的結果。
(4)依次類推,分別為7,10,14。 通過以上的程式可以理解不同的儲存型別的作用範圍不同,在程式設計中如何靈活的使用各種不同的儲存型別是能夠使程式更靈活。
附:執行結果
i=1 j=1
next(i)=11
last(i)=10
sum(i+j)=7
i=1 j=2
next(i)=11
last(i)=10
sum(i+j)=10
i=1 j=3
next(i)=11
last(i)=10
sum(i+j)=14
解析static關鍵字
static在c裡面可以用來修飾變數,也可以用來修飾函式。
先看用來修飾變數的時候。變數在c裡面可分為存在全域性資料區、棧和堆裡。其實我們平時所說的堆疊是棧而不包含對,不要弄混。
int a ;
main()
a是全域性變數,b是棧變數,c是堆變數。
static對全域性變數的修飾,可以認為是限制了只能是本檔案引用此變數。有的程式是由好多.c檔案構成。彼此可以互相引用變數,但加入static修飾之後,只能被本檔案中函式引用此變數。
static對棧變數的修飾,可以認為棧變數的生命週期延長到程式執行結束時。一般來說,棧變數的生命週期由os管理,在退棧的過程中,棧變數的生命也就
結束了。但加入static修飾之後,變數已經不在儲存在棧中,而是和全域性變數一起儲存。同時,離開定義它的函式後不能使用,但如再次呼叫定義它的函式
時,它又可繼續使用, 而且儲存了前次被呼叫後留下的值。
static對函式的修飾與對全域性變數的修飾相似,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫。
c語言的變數儲存型別
C語言 變數儲存型別
c語言中,變數儲存型別指的是儲存變數的記憶體的型別,主要分為三種 普通記憶體 執行時堆疊 硬體暫存器。變數儲存在那種型別的記憶體中和變數的作用域有很大的關係。首先,分析一下變數的作用域。作用域與宣告的位置有關。在乙個原始檔中,變數宣告的位置有兩種 在 塊內和 塊外。塊指的是被花括號 包圍的一段 1 ...
c語言變數儲存型別
在c語言中變數大致分為四種型別它們分別 1 auto 自動變數 2 register 暫存器變數 3 static 靜態變數 4 extern 外部變數 一般形式 儲存型別說明符 資料型別說明符 變數名,變數名 static int i,j auto char c,d static int a 1 ...
c語言 變數儲存型別 extern
extern表示是外部函式或外部變數函式在使用外部變數之前,必須要知道外部變數的名字。需要在使用的外部變數前加extern。在原始檔中,外部變數在函式之前,可以省略extern關鍵字。如果程式包含在多個原始檔中,而某個變數在file1檔案中定義 在file2和file3檔案中使用,那麼在檔案file...