寫在開頭
對於很多c/c++的初學者來說,很容易理不清變數的作用域和儲存型別這一塊的一些概念,也容易將其中的一些概念搞混淆。作為乙個c/c++的初學者,筆者希望在這裡能夠嘗試著去理一理這些較為繁雜的概念,主要當作自己備忘之用。當然,由於筆者水平有限,經驗不足,在這裡也只能羅列一些常用概念和使用方法,且可能會有些許不專業之處,望君理解並指正。
一定要把變數的作用域和儲存型別分開來看
很多人很容易把變數的作用於和儲存型別搞混,但其實只要我們從它們定義出發來看,這個問題是很容易解決的。作用域是乙個變數能夠被使用的範圍,而儲存型別則是變數的儲存方式,且儲存型別決定著變數的生存期。
通俗地講,儲存型別決定著乙個變數在某位置存不存在,而作用域決定著乙個變數在某位置能不能被使用。比如:
1/*例1
*/2 #include3
intmain()
4
a是乙個採用靜態儲存的區域性變數,像這樣的變數在整個檔案中都不會消失,但是只能在main()函式內被使用。
作用域型別
在c語言中有塊作用域、函式作用域、函式原型作用域,以及檔案作用域,在c++中還有類作用域和命名空間作用域。由於在各類資料中關於這幾類作用域的介紹已經相當豐富,在此我就不展開介紹了。在這幾類作用域中,除了函式作用域均可根據名稱來理解,如「具有塊作用域」就是說明該變數在對應**塊(一般來說就是大括號裡包起來的部分,可以省略大括號的for語句、if()語句等除外)中能夠被使用。
函式作用域僅用於goto語句的標籤,由於goto語句已經用得很少,在此筆者不再對函式作用域進行展開介紹。
儲存型別
儲存型別分為靜態儲存和動態儲存,採用靜態儲存方式的變數一旦建立,其儲存空間在整個程式的執行過程中都不會被釋放。對於採用動態儲存的變數來說,當進入該程式塊(函式或復合語句等)時,建立該變數,分配儲存空間,當退出該程式塊時,撤銷該變數,釋放其儲存空間。
在接下來的一部分內容裡,筆者將按照不同的限定詞來對各種常見情況進行分別描述。
不用限定詞的情況
1/*例2,不用限定詞的情況
*/2 #include3
int a=1;//
a為全域性變數,採用靜態儲存
4int
main()
5
全域性變數a採用靜態方式儲存,具有檔案作用域,b採用動態方式儲存,具有的是塊作用域。
使用static
1/*例3
*/2 #include3
static
int a=1;4
intmain()
5
在程式塊外使用static來定義變數
如例3中的變數a。
對於全域性變數來說,加不加static,該變數都採取靜態方式來儲存,但是加了static之後,該變數便變成了「內部變數」,即該變數只能在該檔案內被使用。不加static的全域性變數預設為「外部變數」,可以被其他檔案在進行了引用申明(用extern,稍後介紹)後使用。
在程式塊內使用static來定義變數
如例3中的變數b。
對於定義區域性變數來說,如果不加任何修飾詞,則該變數預設為自動變數,採取動態方式進行儲存。在用static進行修飾的變數定義中,該變數將採取靜態方式進行儲存,而且其初始化在編譯時進行,且只會進行一次。
但是,不管加不加static,在程式塊內定義的變數都只具有塊作用域。
使用extern
1/*例4 part 1*/2
/*file 1.c
*/3 #include4
int a=1;5
static
int b=1;6
intmain()712
int c=1;
1/*例4,part 2*/2
/*file 2.c
*/3 #include4
extern
int a;//
對全域性變數a做引用申明
5extern
int b;//
本行錯誤,因為b僅在file 1.c中有效
6int
main()
7
extern僅用於對全域性變數進行引用宣告,其中包括對在定義在使用處後邊的全域性變數做提前引用宣告(如例4 part 1 第8行),也包括在乙個檔案中對另乙個檔案裡定義的全域性外部變數做引用宣告(如例4 part 2 第4行)。
使用auto、register
使用auto可顯示地宣告自動變數,由於在程式塊內宣告的變數預設是auto的,所以auto更多地也就只是起到乙個標記的作用了。
使用register可以將一些將被頻繁使用的區域性變數放到暫存器中,這樣可以提高程式執行的效率。
變數儲存型別 作用域
auto 作用域和壽命 只能做區域性變數 在函式內或復合語句內定義的自動變數可以省略auto,而在外部定義的無auto的變數顯然不是自動變數 外部變數,即 全域性變數 的壽命和作用域是全域性的 register 作用域和壽命 同auto,即 區域性可見 分配通用暫存器的條件 1 有空閒的暫存器 2 ...
C C 中變數的作用域和生存週期
關鍵字 static extern auto 區域性變數的作用域,起始於定義處,直到所在的大括號處結束。全域性變數的作用域,起始與定義處,知道本檔案結束。參考 先看幾段 理解了他們就理解了作用域的概念 1 includeint main printf a d n a a 10 return 0 整個...
C C 中變數的儲存型別
變數可能存放在三個位置 普通記憶體 靜態儲存區 程式執行堆疊 硬體暫存器。在函式體外定義的和在函式體內定義的並宣告為static型別的儲存在靜態儲存區中,在程式執行之前建立,在程式退出後銷毀。在函式體內定義的預設為 auto 自動變數,儲存在堆疊中,函式返回後,這些變數被銷毀。關鍵字register...