從變數值存在的時間(生存期)劃分:
靜態儲存方式 ————程式執行期間由系統分配固定的儲存空間的方式;
動態儲存方式————程式執行期間根據需要進行動態的分配儲存空間的方式;
記憶體中供使用者使用的儲存空間的分配:
1.程式區
2.靜態儲存區;
3. 動態儲存區;
資料分別放在靜態儲存區 和 動態儲存區;
全域性變數 全部放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式執行完畢釋放;在程式執行過程中他們佔據固定的儲存單元,而不是動態的進行分配和釋放。
在動態儲存區中存放一下資料:
1. 函式的形式引數。在呼叫函式時給 形參分配儲存空間。
2. 自動變數(未加static宣告的區域性變數)
3. 函式呼叫時的現場保護和返回位址。
這些資料,在函式呼叫開始時分配動態儲存空間,函式結束時釋放這些空間。在程式執行過程中,這種分配和釋放是動態的,如果在乙個程式中兩次呼叫同乙個函式,分配給此函式中區域性變數的儲存空間位址可能不同
儲存類別解析:
auto 變數——
函式的區域性變數,如果不專門宣告為static儲存類別,都是動態的分配儲存空間,資料儲存在動態儲存區中。(函式的形參,函式中定義的變數)
static 宣告的區域性變數————
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即其占用的儲存單元不釋放,在下一次呼叫時,其值為 上一次函式呼叫結束時的值。
#includevoid main()
int f( int a)
執行結果為:7 8 9 ( c是靜態區域性變數,函式呼叫結束後,不釋放)
對靜態區域性變數的說明:
(1) 靜態區域性變數資料靜態儲存類別,在靜態儲存區中分配記憶體。在程式整個執行期間都不釋放。
而 自動變數(動態區域性變數),佔動態儲存區,函式呼叫結束後 釋放。
(2) 靜態區域性變數 是在編譯時賦初值的,即只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新
賦初值 只是 保留上次函式呼叫結束時的值。
(3)如在定義區域性變數時不賦初值的話,則對區域性變數:編譯時自動賦初值0(對整型變數)或空字元(對字元變數)。
而對自動變數,不賦初值它的值為 不確定的。
(4) 雖然,靜態區域性變數在函式呼叫結束後仍然存在,但其他函式不能引用它。
static 宣告的外部變數————
在程式中,如果希望某些外部變數只限於被本檔案引用,而不能被其他檔案引用,可以在定義外部變數時加上static宣告。
register 變數
(靜態,動態的都是 放在記憶體中),如果程式用到它了,由控制器發出指令將記憶體中該變數的值送到運算器中。經過運算器進行運算,
如果需要存數,再從運算器將資料送到記憶體存放。
為提高效率,我們可以將區域性變數放到cpu的暫存器中,需要時直接從暫存器取出參加運算,不必再到記憶體中訪問。
說明:(1) 只有區域性變數和形式引數可以作為暫存器變數。
(2) 靜態區域性變數不能定義為暫存器變數。不能寫成:
register static int a ,b , c;
(3) 不能定義任意 多個 暫存器變數。
extern 宣告外部變數————
1. 在乙個檔案內宣告外部變數
如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案結束。
如果在定義點之前的函式想引用該外部變數,則應該在應用之前用關鍵字extern 對該變數作「外部變數宣告」,表示該變數時乙個已經定義的外部變數。
用 extern 擴充套件它的程式檔案中的作用域
#include
void main()
int a = 13 , b = -8;
int max(int x , int y)
2. 在多檔案的程式中 宣告外部變數
如果乙個程式中包含兩個檔案,在兩個檔案中都要用到同乙個外部變數num:在任乙個檔案中定義外部變數num, 而在另乙個檔案中用extern對num作
「外部變數宣告」 ,即「extern num;」
c語言變數儲存
記憶體中供使用者使用的儲存空間分為 區與資料區兩個部分。變數儲存在資料區,資料區又可分為靜態儲存區與動態儲存區。靜態儲存是指在程式執行期間給變數分配固定儲存空間的方式。如全域性變數存放在靜態儲存區中,程式執行時分配空間,程式執行完釋放。動態儲存是指在程式執行時根據實際需要動態分配儲存空間的方式。如形...
C語言 變數的儲存型別 和 指標(2)
一 變數的儲存型別 1.register int a 1 定義乙個暫存器變數,a存放在暫存器中,暫存器變數不能取位址 2.extern int a 1 宣告乙個外部變數,宣告不用分配空間 定義變數要分配空間 3.static 1 在函式外部 static int a 1 static 修飾全域性變數...
C語言的變數 2
上文說到,全域性變數的作用範圍是從其定義開始,至程式結束為止。但在大型程式開發時,專案往往由多個原始檔構成。某個原始檔往往會用到其他原始檔裡定義的全域性變數,這時應該怎麼辦呢?這時我們就可以用 extern 關鍵字,對這個變數進行宣告,告訴編譯器,這個變數在其他地方是定義過的。演示extern宣告全...