2:C變數的 作用域 和 生命週期(儲存期)

2020-08-13 10:29:00

 

在開發一些小程式的時候,也許我們並不在意作用域的必要性。可是,當你書寫幾萬行,甚至幾十萬行的程式碼的時候,沒有作用域肯定是不能忍受的。

C 語言有如下 3 種作用域。

1、全域性變數

在函數之外宣告的變數,預設地會成爲全域性變數。全域性變數在任何地方都是可見的。當程式被分割爲多個原始碼檔案進行編譯時,宣告爲全域性變數的變數也是可以從其他原始碼檔案中參照的。

2、檔案內部的靜態變數

就算對於像全域性變數那樣被定義在函數外面的變數,一旦新增了 static,作用域就只限定在當前所在的原始碼檔案中。通過 static 指定的變數(包括函數),對於其他原始碼檔案是不可見的。在英語中,static 是「靜態的」的意思,我實在想不明白爲什麼這個功能莫名其妙地被冠以「static」,這一點可以算是 C 語言的一個未解之謎。

3、區域性變數

區域性變數是指在函數中宣告的變數。區域性變數只能在包含它的宣告的語句塊(使用{}括起來的範圍)中被參照。

區域性變數通常在函數的開頭部分進行宣告,但也可以在函數內部某語句塊的開頭進行宣告。例如,在「交換 2 個變數的內容時,需要使用一下臨時變數」的情況下,將區域性變數宣告放在當前語句塊開頭還是比較方便的。

區域性變數通常在它所在的語句塊結束的時候被釋放。如果你不想釋放某個區域性變數,可以在區域性變數上加上 static 進行宣告。

 

另外,除了作用域不同,C 的變數之間還有 儲存期(storage duration)的差別。

1、靜態儲存期(static storage duration)

全域性變數、檔案內的 static 變數、指定 static 的區域性變數都持有靜態儲存期。這些變數統稱爲靜態變數

持有靜態儲存期的變數的壽命從程式執行時開始,到程式關閉時結束。換句話說,靜態變數一直在於記憶體的同一個地址上。