C語言變數儲存類別

2021-06-29 04:45:00 字數 2522 閱讀 1305

變數除了型別屬性(int ,char ,float....)外,另外乙個重要屬性就是儲存類別

系統把程式中用到的資料區分為靜態儲存區和動態儲存區。

靜態儲存區:在這個區分配了空間的變數,在程式執行過程中一直存在,即相對是不變的。

動態儲存區:在這個區分配了空間的變數,可能隨時被釋放,即相對是不斷變化的。

c語言提供了儲存類別說明符包括:auto(自動的),static(靜態的),register(寄存的),extern(外部的)

語法格式:   [儲存類別說明符] 型別說明符 變數;             如:  static int a;

在定義變數時,儲存類別說明符可以省略,預設情況下是auto,系統會根據變數是區域性變數還是全域性變數自行分配。

其中,全域性-------靜態儲存區                  區域性---------------動態儲存區。

ps:解釋下全域性變數和區域性變數

全域性變數:  全域性變數也稱為外部變數,它是在函式外部定義的變數。它不屬於哪乙個函式,它屬於乙個源程式檔案。其作用域是整個源程式。在函式中使用全域性變數,一般應作全域性變數說明。只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符為extern。但在乙個函式之前定義的全域性變數,在該函式內使用可不再加以說明。

[cpp]view plain

copy

intmain()  

printf("%d\n"

,k);  

return

0;  

}  

執行結果:   8

5本程式在main中定義了i,j,k三個變數,其中k未賦初值。而在復合語句內又定義了乙個變數k,並賦初值為8。應該注意這兩個k不是同乙個變數。在復合語句外由main定義的k起作用,而在復合語句內則由在復合語句內定義的k起作用。因此程式第4行的k為main所定義,其值應為5。第7行輸出k值,該行在復合語句內,由復合語句內定義的k起作用,其初值為8,故輸出值為8,第9行輸出i,k值。i是在整個程式中有效的,第7行對i賦值為3,故以輸出也為3。而第9行已在復合語句之外,輸出的k應為main所定義的k,此k值由第4 行已獲得為5,故輸出也為5。

注:如果同乙個原始檔中,外部變數與區域性變數同名,則在區域性變數的作用範圍內,外部變數被遮蔽,即它不起作用。

當然,我們也可以改變變數的儲存區,即人為的設定。 

注意,全域性變數一定是在靜態儲存區分配空間,這點不能改變。(全域性變數在程式執行過程中自始至終都存在)

至於區域性變數,它可以在動態區,也可以在靜態區。

下面舉例說明區域性靜態變數。

[cpp]view plain

copy

#include 

#include 

intfunc( 

void

)    

intmain()  

}  [cpp]view plain

copy

輸出為:  1  2  3  4  5  

在函式func第一次被呼叫的時候,系統為靜態區域性變數c在靜態區分配空間,並賦初值0,函式執行後c變為1,當函式返回時,變數c的空間並不釋放,依舊保持在靜態區,並且保留現有資料值1,當函式再次被呼叫時,不再為c重新分配空間,還是利用原有c,所以執行+1操作後,c變成2.,如此進行。

現在談談靜態全域性變數。  之前提過,全域性變數一定是在靜態儲存區分配空間,而這裡的static,不是說明全域性變數在哪個儲存區分配空間,而是用來限制變數作用域的。

這就關聯到了我們要談的extern,當在編寫較大程式時,往往將**分成不同的幾個原始檔分別儲存,這樣就得利用到extern來訪問其他原始檔中的變數。

如果在乙個原始檔中定義的全域性變數不允許其他檔案中的**使用,則將變數定義成靜態全域性變數,即使在其他檔案中使用了extern宣告也無法使用。

例如:[html]view plain

copy

int a;  

static int b; //靜態全域性變數  

main()    

[html]view plain

copy

extern int a;  // 說明後可以引用  

extern int b;  //說明後也無法引用  

func()    

最後說明下register,register定義的變數,是將變數儲存在cpu的內部暫存器中,從而避免每次的記憶體訪問,以達到提高效率的目的。所以,一般是在**量小的,經常使用的進行特殊宣告。   不過實際上,暫存器是十分有限的,並且受到資料型別的限制,還有並不是所有的編譯器都能實現這一功能,所以具體使用比較少。

今天就先寫這些,主要介紹了4種變數的儲存類別,   希望,能給大家帶來一些幫助。

水平有限,如有錯誤,歡迎指正。

C語言變數的儲存類別

前面已經介紹了,從變數的作用域 即從空間 角度來分,可以分為全域性變數和區域性變數。從另乙個角度,從變數值存在的作時間 即生存期 角度來分,可以分為 靜態儲存方式 和動態儲存方式。使用者儲存空間可以分為三個部分 程式區 靜態儲存區 動態儲存區。全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性...

c語言 變數的儲存類別

1.動態儲存方式與靜態儲存方式 執行結果 1 函式中的區域性變數 形參 在函式中定義的變數等 如果不專門宣告為static儲存類別,都是動態分配儲存空間的,在函式呼叫時系統給這些變數分配空間,在呼叫結束時系統就自動釋放這些記憶體空間,因此這類區域性變數被稱為自動變數。2 實際上,關鍵字 auto 可...

C 語言變數的儲存類別

儲存類別是變數的屬性之一。在我們定義乙個變數時,其實是有字首的,只是我們通常省略。c 語言有4中變數的儲存類別,分別是auto變數 static變數 register變數 extern變數。不同的變數儲存方式會使變數的生存期不同,生存期表示了變數存在的時間。生存期和變數作用域是從時間和空間這兩個不同...