C語言總結-----變數的儲存方式和生存期
儲存方式 從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。
從變數值存在的時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。 靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。 動態儲存方式:是在程式執行期間根據需要進行動態的分配儲存空間的方式。 資料儲存類別 根據資料儲存過程和儲存位置的不同,將C的儲存類別分為4種:自動的(auto)、靜態的(static)、暫存器的(register)、外部的(extern)。根據變數的儲存類別,可以知道變數的作用域和生存期。
- 區域性變數預設為auto型
- register型變數個數受限,且不能為long, double, float型
- 區域性static變數具有全域性壽命和區域性可見性
- 區域性static變數具有可繼承性(下次進入函式該值還存在)
- extern不是變數定義,可擴充套件外部變數作用域
一、自動變數auto
函式中的區域性變數,如不專門宣告為 static 儲存類別,都是動態地分配儲存空間的,資料儲存在動態儲存區中。
如函式中的形參和在函式中定義的變數,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。
這類區域性變數稱為自動變數。自動變數用關鍵字 auto 作儲存類別的宣告。
關鍵字 auto 可以省略, auto 不寫則隱含定為“自動儲存類別”,屬於動態儲存方式
二、靜態區域性變數static
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為“靜態區域性變數”,用關鍵字 static 進行宣告。 注意:
(1)靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後即釋放。 (2) 靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。 (3) 如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值 0 (對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是一個不確定的值。
三、暫存器變數register
一般情況下,運算器到記憶體中存取變數,對於頻繁使用的變數,可將區域性變數放在 CPU 的暫存器中,運算器對暫存器的讀取速度比記憶體快的多,因此大大提高了效率。這種變數叫“暫存器變數”,用關鍵字register 作宣告。 說明:(1) 只有區域性自動變數和形式引數可以作為暫存器變數; (2) 一個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數。
(3)register變數只是向cpu提出申請,但不一定能申請成功。
四、外部變數extern(即全域性變數)
- 外部變數(即全域性變數)是在函式的外部定義的
- 它的作用域為從變數定義處開始,到本程式檔案的末尾。
- 如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案終了。如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字 extern對該變數作“外部變數宣告”。表示該變數是一個已經定義的外部變數。有了此宣告,就可以從“宣告”處起,合法地使用該外部變數。
1、在一個檔案內擴充套件外部變數的作用域 2、將外部變數的作用域擴充套件到其他檔案 在任意一個檔案中對變數進行定義,在另一個檔案中用extern對該變數進行外部宣告,就可以在本檔案中使用其他檔案的定義過的變量了。 注意:編譯遇到extern時,先在本檔案內找外部變數的定義,如果沒有找到再到其他檔案尋找該變數的定義。 3、將外部變數的作用域限制在本檔案中 由於一個任務可能由若干人完成,為了防止自己的檔案變數被別人引用修改,在外部變數前加static,即將該變數限制在本檔案中,其他檔案將不能使用該變數。
- 外部函式
如果定義函式時在函式首部加上extern,該函式為外部函式,可供其他檔案呼叫。當在定義函式時,省略extern,則預設為外部函式。(如例4)