靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變, 直至整個程式結束。5.5.1節中介紹的全域性變數即屬於此類儲存方式。動態儲存變數是在程式執行過程中,使用它時才分配儲存單元, 使用完畢立即釋放。 典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配, 呼叫函式完畢立即釋放。如果乙個函式被多次呼叫,則反覆地分配、 釋放形參變數的儲存單元。從以上分析可知, 靜態儲存變數是一直存在的, 而動態儲存變數則時而存在時而消失。我們又把這種由於變數儲存方式不同而產生的特性稱變數的生存期。 生存期表示了變數存在的時間。 生存期和作用域是從時間和空間這兩個不同的角度來描述變數的特性,這兩者既有聯絡,又有區別。 乙個變數究竟屬於哪一種儲存方式, 並不能僅從其作用域來判斷,還應有明確的儲存型別說明。
在c語言中,對變數的儲存型別說明有以下四種:
auto 自動變數
register 暫存器變數
extern 外部變數
static 靜態變數
自動變數和暫存器變數屬於動態儲存方式, 外部變數和靜態變數屬於靜態儲存方式。在介紹了變數的儲存型別之後, 可以知道對乙個變數的說明不僅應說明其資料型別,還應說明其儲存型別。 因此變數說明的完整形式應為: 儲存型別說明符 資料型別說明符 變數名,變數名…; 例如:
static int a,b; 說明a,b為靜態型別變數
auto char c1,c2; 說明c1,c2為自動字元變數
static int a[5]=; 說明a為靜整型陣列
extern int x,y; 說明x,y為外部整型變數
下面分別介紹以上四種儲存型別:
一、自動變數的型別說明符為auto。
這種儲存型別是c語言程式中使用最廣泛的一種型別。c語言規定, 函式內凡未加儲存型別說明的變數均視為自動變數, 也就是說自動變數可省去說明符auto。 在前面各章的程式中所定義的變數凡未加儲存型別說明符的都是自動變數。例如:
等價於:
自動變數具有以下特點:
1. 自動變數的作用域僅限於定義該變數的個體內。在函式中定義的自動變數,只在該函式內有效。在復合語句中定義的自動變數只在該復合語句中有效。 例如:
int kv(int a)
/*c的作用域*/
……} /*a,x,y的作用域*/
2. 自動變數屬於動態儲存方式,只有在使用它,即定義該變數的函式被呼叫時才給它分配儲存單元,開始它的生存期。函式呼叫結束,釋放儲存單元,結束生存期。因此函式呼叫結束之後,自動變數的值不能保留。在復合語句中定義的自動變數,在退出復合語句後也不能再使用,否則將引起錯誤。例如以下程式:
main()
printf(\"s=%d p=%d\\n\",s,p);
}s,p是在復合語句內定義的自動變數,只能在該復合語句內有效。而程式的第9行卻是退出復合語句之後用printf語句輸出s,p的值,這顯然會引起錯誤。
3. 由於自動變數的作用域和生存期都侷限於定義它的個體內( 函式或復合語句內), 因此不同的個體中允許使用同名的變數而不會混淆。 即使在函式內定義的自動變數也可與該函式內部的復合語句中定義的自動變數同名。例5.14表明了這種情況。
[例5.14]
main()
printf(\"s=%d p=%d\\n\",s,p);
} 本程式在main函式中和復合語句內兩次定義了變數s,p為自動變數。按照c語言的規定,在復合語句內,應由復合語句中定義的s,p起作用,故s的值應為a+ a,p的值為a*a。退出復合語句後的s,p 應為main所定義的s,p,其值在初始化時給定,均為100。從輸出結果可以分析出兩個s和兩個p雖變數名相同, 但卻是兩個不同的變數。
4. 對構造型別的自動變數如陣列等,不可作初始化賦值。
動態儲存方式與靜態動態儲存方式:
從變數的作用域(即從空間)角度來分,可以分為
全域性變數
和區域性變數。
從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。
靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。
動態儲存方式:是在程式執行期間根據需要進行動態的分配儲存空間的方式。
使用者儲存空間可以分為三個部分:
1) 程式區;2)
靜態儲存區;3)
動態儲存區;
全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不動態地進行分配和釋放;
動態儲存區存放以下資料:
1) 函式形式引數;
2) 自動變數(未加static宣告的區域性變數);
3) 函式呼叫實的現場保護和返回位址;
對以上這些資料,在函式開始呼叫時分配動態儲存空間,函式結束時釋放這些空間。
在c語言中,每個變數和函式有兩個屬性:資料型別和資料的儲存類別。
靜態儲存 動態儲存 靜態變數與動態變數
動態變數 int a 靜態變數 static int a 靜態變數,全域性動態變數都是靜態儲存,儲存在全域性資料區,在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。靜態儲存變數是一直存在的,只會初始化一次。區域性動態變數是動態儲存,動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,...
C 靜態儲存,動態儲存
什麼是靜態儲存,動態儲存 靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,使用完畢立即釋放。典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,呼叫函式完畢立即釋放。如果...
C 動態儲存方式與靜態儲存方式
如果從變數值存在的時間 即生存期 來分,可將程式中的變數分為 動態儲存方式和靜態儲存方式。它們所占用的儲存空間區域不同。區 存放可執行程式的程式 靜態儲存區 存放靜態變數和全域性變數。棧區 stack 存放動態區域性變數 堆區 heap 存放new和 malloc 申請的動態記憶體。棧區和堆區統稱為...