譚浩強書:
從儲存模型可以看到,譚浩強和錢能的模型有一定的對應關係:
靜態儲存區 -> 全域性資料區
動態儲存區 -> 棧(stack)
變數的型別:
1. 區域性變數和全域性變數
區域性變數也稱為內部變數。 區域性變數是在函式內作定義說明的。其作用域僅限於函式內, 離開該函式後再使用這種變數是非法的。
全域性變數也稱為外部變數,它是在函式外部定義的變數。它不屬於哪乙個函式,它屬於乙個源程式檔案。其作用域是整個源程式。在函式中使用全域性變數,一般應作全域性變數說明。 只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符為 extern。但在乙個函式之前定義的全域性變數,在該函式內使用可不再加以說明。
從變數的作用域
(全域性作用域,區域性作用域,檔案作用域
)(即從空間)角度來分,可以分為
全域性變數(靜態全域性變數的作用域是該檔案範圍
(檔案作用域
)區域性變數。
從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。可見生存週期只是和變數儲存的位置相關。
auto
變數: 函式中的區域性變數,如不專門宣告為 static 儲存類別,都是動態地分配儲存空間的,資料儲存在動態儲存區中。函式中的形參和在函式中定義的變數(包括在復合語句中定義的變數),都屬此類,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。這類區域性變數稱為自動變數。自動變數用關鍵字 auto 作儲存類別的宣告。
關鍵字 auto可以省略,auto 不寫則隱含定為「自動儲存類別」,屬於動態儲存方式。
用static
宣告區域性變數
: 有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字 static 進行宣告
變數:為了提高效率,c 語言允許將區域性變數的值放在 cpu 中的暫存器中,這種變數叫「暫存器變數」,用
關鍵字 register 作宣告。
1) 只有區域性自動變數和形式引數可以作為暫存器變數;
2) 乙個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數;
3) 區域性靜態變數不能定義為暫存器變數
用extern
宣告外部變數:
外部變數(即全域性變數)是在函式的外部定義的,它的作用域為從變數定義處開始,到
本程式檔案的末尾。如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到
檔案終了。如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字 extern
對該變數作「外部變數宣告」。表示該變數是乙個已經定義的外部變數。有了此宣告,就可
以從「宣告」處起,合法地使用該外部變數。
總結:從作用域來劃分分為:
- 自動變數auto,即動態區域性變數(離開函式,值消失)
區域性變數 - 靜態區域性變數static(離開函式,值還保留)
- 暫存器區域性變數register(離開函式,值消失)
- 形式引數可以定義為自動變數或者register變數
- 靜態外部變數(作用域只能在該檔案中,檔案作用域)
全域性變數 - 外部變數(非靜態外部變數,全域性變數,可以被其它檔案使用)
從變數的生存週期來分:
- 自動變數auto
動態儲存 - 暫存器變數register
- 形式引數
- 靜態區域性變數
靜態儲存 - 靜態外部變數
- 外部變數(全域性變數)
從變數值存放的位置:
- 靜態區域性變數
記憶體中的靜態儲存區(全域性資料區) - 靜態外部變數
- 外部變數(全域性變數)
- 自動變數auto
記憶體中的動態儲存區(棧) - 形式引數
cpu中的暫存器 - 暫存器變數register
區域性靜態(static)變數,作用域為區域性,而生命週期是全程。 靜態區域性變數屬於靜態儲存方式,它具有以下特點: (1)靜態區域性變數在函式內定義,但不象自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。 (2)靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同,即只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還繼續存在,但不能使用它。
C語言中變數的作用域和生命週期
譚浩強書 從儲存模型可以看到,譚浩強和錢能的模型有一定的對應關係 靜態儲存區 全域性資料區 動態儲存區 棧 stack 變數的型別 1.區域性變數和全域性變數 區域性變數也稱為內部變數。區域性變數是在函式內作定義說明的。其作用域僅限於函式內,離開該函式後再使用這種變數是非法的。全域性變數也稱為外部變...
C語言中變數的作用域和生命週期
在內部定義的變數就是區域性變數 只有執行到定義變數的這個語句,系統才會給這個變數分配儲存空間 當離開,這個非static區域性變數自動釋放 區域性變數的作用域在當前的,離開此,無法使用 不同的中,變數名字可以一樣,遵循就近原則 在內部定義的變數就是區域性變數 static區域性變數,是在編譯階段就已...
C語言變數作用域和生命週期
1 c語言不支援對形參變數的引用,也就是說,形參變數的作用域僅在於函式定義域內 2 有的c語言編譯器支援對變數不在函式開始的時候定義 3 全域性變數可以作為函式間通訊的乙個工具 4 全域性變數可以通過減少函式形引數,較少記憶體空間,較少傳遞資料的時間消耗 5 動態變數的生命週期和其所在的汗水一樣 6...