變數儲存型別

2021-07-30 20:50:54 字數 2476 閱讀 6010

在c語言中,變數和函式有兩種型別:

(1)資料型別:資料型別表示資料的含義,取值範圍和允許的操作;

(2)儲存型別:儲存型別表示資料的儲存介質(記憶體或暫存器)、生存期和作用域。

靜態儲存方式和動態儲存方式

記憶體中供使用者使用的儲存空間可分為程式區、動態儲存區、靜態儲存區。程式區用來儲存程式**,動態儲存區和靜態儲存區用來存放資料。動態和靜態儲存區中的變數生存期是不同的。

1.靜態儲存方式

靜態儲存方式的變數儲存在記憶體中的靜態儲存區,在編譯時就分配了儲存空間。在整個程式執行期間,該變數一直占有固定的儲存空間,程式結束後,這部分空間才釋放。這類變數的生存期是整個程式。靜態區域性變數和全域性變數都儲存在靜態儲存區中。

2.動態儲存方式

動態儲存方式的變數儲存在記憶體中的動態儲存區,在函式執行過程中,只有變數所在函式被呼叫時,編譯系統才臨時為該變數分配一段儲存單元。函式呼叫結束後,所佔空間被釋放,變數值消失。該類變數的生存期僅在函式呼叫期間。

c語言中有五種儲存型別的變數:自動區域性變數、靜態區域性變數、暫存器變數、靜態全域性變數和外部變數。

1.靜態區域性變數

用關鍵字static定義的區域性變數是靜態區域性變數,它放置在記憶體中的靜態儲存區中,所占用的儲存單元不釋放直至整個程式執行結束。所以靜態區域性變數在函式呼叫結束後任保持原值。在下一次函式呼叫時,該變數的值就是上一次函式呼叫結束時儲存的值。

靜態區域性變數的初始化只在編譯時進行一次,程式執行過程中不再重新進行初始化。只有程式結束並再次執行程式時,靜態區域性變數才重新被賦初始值。

靜態區域性變數特點

(1)靜態區域性變數屬於靜態儲存類別,是在靜態儲存區分配儲存單元。

(2)靜態區域性變數與全域性變數一樣,均只在編譯時賦值一次。以後每次呼叫時不會重新賦初值,而是使用上次函式呼叫結束時保留下來的值。

(3)靜態區域性變數定義時如果沒有賦初值,系統編譯時會自動給其賦初值,重新進行初始化。

(4)雖然靜態區域性變數在函式呼叫結束後依然存在,但它們僅能為定義它們的函式所使用,其它函式不能使用。

void func()

int main(void)

執行結果:  func:a=4     main:a=8
2.靜態全域性變數

用關鍵字static定義的全域性變數是靜態全域性變數,當需要把全域性變數的作用域限定本檔案之內,可以在定義全域性變數時用關鍵字static來限定,稱為靜態全域性變數。靜態全域性變數禁止在其它檔案中訪問。靜態全域性變數的宣告和靜態區域性變數的生存期相同,都是整個程式的執行全程。

static

int a = 4; //靜態全域性變數

int main(void)

執行結果:4
3.非靜態全域性變數

沒有用關鍵字static來限定的全域性變數可以在其它檔案中訪問,稱為非靜態全域性變數。

但要在其它檔案中對它訪問,還必須在其它檔案的訪問語句之前,用外部變數宣告語句對已定義過的非靜態全域性變數進行外部引用宣告。已經用外部變數宣告語句過的變數稱為外部變數。

外部變數宣告:

int a = 4;  //非靜態全域性變數

int main(void)

執行結果:4
4.自動變數

函式中的區域性變數,不用static宣告的即為自動變數,自動變數儲存在動態儲存區中。函式中的形參和函式中的定義的變數都屬於自動變數。

不加關鍵字static的區域性變數都屬於自動變數,可以使用auto作自動型別說明。

auto

int a; //等價於int a;

auto

float b; //等價於float b;

自動變數特點:

復合語句中宣告的變數及函式中的形參變數均屬於自動區域性變數。

全域性變數不能是自動變數。

若不對自動變數賦初值,則其值時隨機的。

5.暫存器變數

有些程式需要多次訪問記憶體中的變數,這使得程式的執行效率大大降低,而暫存器的訪問速度要遠遠快於記憶體中資料的訪問速度,為此,c語言設定了一中儲存型別,直接分配在cpu的儲存器中,這種變數即為儲存器變數。

暫存器變數宣告

register

int a;

暫存器變數說明:

(1)暫存器是與硬體密切相關的,不同型別的計算機,暫存器的數目是不同的,通常為2個或3個。對於乙個函式中說明的多於2到3個暫存器變數,c編譯系統會自動地將暫存器變數變為自動型別變數。由於受硬體暫存器長度的限制,所以暫存器變數只能是char、int、short或指標型。

(2)暫存器變數的作用域和生命週期與自動變數是一樣的,因此,只有自動型別區域性變數可以宣告為暫存器變數。

(3)暫存器變數的分配方式是動態的,靜態變數不能宣告為暫存器變數。

變數儲存型別

變數的儲存類有什麼作用?問題解決 儲存類的作用是用來說明識別符號的作用域和儲存期的。c語言的變數的完全說明格式為 儲存類 資料型別 變數名 儲存類分為4種 auto 自動型別 static 靜態變數型別 register 暫存器變數型別 extern 外部型別 變數儲存在記憶體的什麼地方?問題解決 ...

變數的儲存型別

曾巨集安,華清遠見嵌入式學院 講師。我們在程式中會經常定義一些變數來儲存和處理資料。從本質上看,變數代表了一段可操作的記憶體,也可以認為變數是記憶體的符號化表示。當程式中需要使用記憶體時,可以定義某種型別的變數。此時編譯器根據變數的資料型別分配一定大小的記憶體空間。程式就可以通過變數名來訪問對應的記...

變數的儲存型別

儲存型別是從變數的存在時間 即生存期 來劃分變數。變數的儲存型別可分為靜態儲存方式和動態儲存方式。對於動態儲存變數,當程式執行到該變數處時才為其分配儲存空間,當程式執行到該變數所在作用域的結束處時自動收回為其分配的儲存空間,因此它的生存期為所在作用域。在程式開始就執行就為其分配儲存空間,直到程式結束...