一、儲存空間的情況
使用者區程式區
靜態儲存區
動態儲存區
靜態儲存方式:在程式執行期間由系統分配固定的儲存空間的方式。
動態儲存方式:在程式執行期間根據需要進行動態的分配儲存空間的方式。
二、資料儲存位置
靜態儲存區:全域性變數全部存放在靜態儲存區。
動態儲存區:(1)函式形式引數。
(2)函式中定義的沒有用關鍵字static宣告的變數,即自動變數。
(3)函式呼叫時的現場保護和返回位址等。
三、變數與函式的屬性
(1)資料型別;
(2)資料的儲存類別;
c語言的儲存類別:自動的(auto),靜態的(static),暫存器的(register),外部的(extern)。
四、區域性變數的儲存類別
1. 自動變數(auto變數):不專門宣告static(靜態)儲存類別,都動態的分布儲存空間。若無關鍵字則暗指「自動儲存類別」。
2. 靜態區域性變數(static區域性變數):
例:
#includeint main()
int f(int a) //定義f函式,a為形參
靜態區域性變數:屬於靜態儲存類別,在靜態儲存區內分配儲存類別。在整個程式執行期間都不得釋放。
自動變數:屬於動態儲存類別,分配在動態儲存區空間,函式呼叫結束後即釋放。
靜態區域性變數在編譯時賦初值,且只賦初值一次。如果定義區域性變數時不賦初值,編譯時自動賦初值0(對數值型變數)或空字元'\0'(對自負變數)
自動變數的值是乙個不確定的值。
靜態區域性變數在函式呼叫後仍然存在,但其他函式不可再呼叫。
例:輸出1到5的階乘值
#includeint main()
int a(int n)
靜態儲存要多佔記憶體,降低程式的可讀性。當呼叫次數過多時會導致不清楚當前值是什麼,因此應少使用靜態區域性變數。
3.暫存器變數(register變數):經區域性變數的值存放在cpu中的暫存器中,需要時直接取出參加運算,不再從記憶體中訪問。
注:三種區域性變數儲存位置不同:自動變數儲存在動態儲存區;靜態區域性變數儲存在靜態儲存區;暫存器儲存在cpu中的暫存器中。
五、全域性變數的儲存類別
全域性變數存放自靜態儲存區中,生存期固定,存在於程式的整個執行過程中。
1.在乙個檔案內擴充套件外部變數的作用域
例:
#includeint main()
int a,b,c; //定義外部變數a,b,c
int max()
提倡將外部變數的定義放在引用他的所有函式之前,避免在函式中多加乙個extern宣告。
2.將外部變數的作用域擴充套件到其他檔案
例:給定b的值,輸入a和m,求a*b和a^m的值。
//檔案1
#includeint a; //定義外部變數
int main()
//檔案2
extern a; //把在檔案1中已定義的外部變數的作用域擴充套件到本檔案
int power(int m)
檔案2的開頭有乙個extern宣告,宣告在本檔案**現的變數a是乙個「在其他檔案中定義過的外部變數」。本來外部變數a的作用域是檔案1,但現在用extern宣告將其作用於擴大到檔案2。
應注意防止改變該全域性變數的值,影響到另乙個檔案中全域性變數的值,從而影響該檔案中函式的執行結果。
3.將外部變數的作用域限制在本檔案中
在定義外部變數是加乙個static宣告,是外部變數只限於本檔案中引用,而不能被其他檔案引用。
檔案1
static int a;
int main()
檔案2extern a;
viod fun(int n)
檔案1中定義的全域性變數a,因使用了static宣告,將a的作用域限制在本檔案範圍內。
檔案2中使用了「extern a」但仍不能使用檔案1中的全域性變數a。
宣告區域性變數的儲存型別和宣告全域性變數的儲存型別是不同的:
區域性變數:宣告儲存型別的作用指定變數儲存的區域(靜態儲存區或動態儲存區)以及由此產生的生存期問題。
全域性變數:宣告儲存型別的作用是變數作用域的擴充套件問題。
用static宣告乙個變數的作用:
對區域性變數:把其分配在靜態儲存區,該變數在這整個程式執行期間不釋放,其所分配的空間始終存在。
變數按其生存期可分為動態變數和靜態變數
變數只能在其生存期內被引用,而變數的作用域直接影響變數的生存期。
靜態生存期:只要程式開始執行,其就被分配了記憶體,生存期與程式的執行期相同.
區域性生存期:開始於程式執行經過其宣告點時,結束於命名它的識別符號所在的作用域尾.
動態生存期:可以隨時建立,隨時刪除,建立和刪除是程式設計師用記憶體操作函式進行的。
變數的儲存方式和生存期
靜態儲存方式和動態儲存方式 靜態儲存方式是指在程式執行期間由系統分配固定的儲存空間的方式。動態儲存方式是在程式運氣期間根據需要進行動態的分配儲存空間的方式。記憶體中供使用者使用的儲存空間分為三個部分 1 程式區 2 靜態儲存區 3 動態儲存區。c的儲存型別包括四種 自動的 auto 靜態的 stat...
變數的儲存方式和生存期
從變數的作用域 即從空間 角度來分,可以分為全域性變數和區域性變數。另乙個角度,從變數值存在的作時間 即生存期 角度來分,可以分為靜態儲存方式和動態儲存方式。靜態儲存方式 是指在程式執行期間分配固定的儲存空間的方式。動態儲存方式 是在程式執行期間根據需要進行動態的分配儲存空間的方式。使用者儲存空間可...
變數生存期
統計共呼叫counter 函式多少次。count.c檔案 include intmain mycounter.c counter 函式 void counter 函式宣告 void counter 執行結果為 count 1,結果不對。因為counter 函式中的count是區域性變數,自動儲存,每...