變數的儲存方式和儲存類別

2021-05-28 15:35:09 字數 2179 閱讀 2982

1、動態儲存方式與靜態儲存方式

儲存期可以分為靜態儲存期(static storage duration)和動態儲存期(dynamic storage duration)。這是由變數的靜態儲存方式和動態儲存方式決定的。所謂靜態儲存方式是指在程式執行期間,系統對變數分配固定的儲存空間。而動態儲存方式則是在程式執行期間,系統對變數動態地分配儲存空間。

先看一下記憶體中的供使用者使用的儲存空間的情況。這個儲存空間可以分為三部分,即:   

(1) 程式區

(2) 靜態儲存區

(3) 動態儲存區

資料分別存放在靜態儲存區和動態儲存區中。全域性變數全部存放在靜態儲存區中,在程式開始執行時給全域性變數分配儲存單元,程式執行完畢就釋放這些空間。在程式執行過程中它們佔據固定的儲存單元,而不是動態地進行分配和釋放。

在動態儲存區中存放以下資料: 

a、數形式引數。在呼叫函式時給形參分配儲存空間。

b、函式中的自動變數(未加static宣告的區域性變數,詳見後面的介紹)。

c、函式呼叫時的現場保護和返回位址等。

對以上這些資料,在函式呼叫開始時分配動態儲存空間,函式結束時釋放這些空間。在程式執行過程中,這種分配和釋放是動態的,如果在乙個程式中兩次呼叫同一函式,則要進行兩次分配和釋放,而兩次分配給此函式中區域性變數的儲存空間位址可能是不相同的。

2、儲存類別(storage class)

在c++中變數除了有資料型別的屬性之外,還有儲存類別(storage class) 的屬性。儲存類別指的是資料在記憶體中儲存的方法。儲存方法分為靜態儲存和動態儲存兩大類。具體包含4種:自動的(auto)、靜態的(static)、暫存器的(register)和外部的(extern)。根據變數的儲存類別,可以知道變數的作用域和儲存期。

ø  自動變數

函式中的區域性變數,如果不用關鍵字static加以宣告,編譯系統對它們是動態地分配儲存空間的。函式的形參和在函式中定義的變數(包括在復合語句中定義的變數)都屬此類。在呼叫該函式時,系統給形參和函式中定義的變數分配儲存空間,資料儲存在動態儲存區中。在函式呼叫結束時就自動釋放這些空間。如果是在復合語句中定義的變數,則在變數定義時分配儲存空間,在復合語句結束時自動釋放空間。因此這類區域性變數稱為自動變數(auto variable)。自動變數用關鍵字auto作儲存類別的宣告。

ø  用static宣告靜態區域性變數

有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即其占用的儲存單元不釋放,在下一次該函式呼叫時,該變數保留上一次函式呼叫結束時的值。這時就應該指定該區域性變數為靜態區域性變數(static local variable)。 

靜態區域性變數在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,儲存在動態儲存區空間(而不是靜態儲存區空間),函式呼叫結束後即釋放。

為靜態區域性變數賦初值是在編譯時進行值的,即只賦初值一次,在程式執行時它已有初值。以後每次呼叫函式時不再重新賦初值而只是保留上次函式呼叫結束時的值。而為自動變數賦初值,不是在編譯時進行的,而是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。

ø  用extern宣告外部變數

全域性變數(外部變數)是在函式的外部定義的,它的作用域為從變數的定義處開始,到本程式檔案的末尾。在此作用域內,全域性變數可以為本檔案中各個函式所引用。編譯時將全域性變數分配在靜態儲存區。有時需要用extern來宣告全域性變數,以擴充套件全域性變數的作用域

ø  用static宣告靜態外部變數

加上static宣告、只能用於本檔案的外部變數(全域性變數)稱為靜態外部變數。這就為程式的模組化、通用性提供了方便。如果已知道其他檔案不需要引用本檔案的全域性變數,可以對本檔案中的全域性變數都加上static,成為靜態外部變數,以免被其他檔案誤用。

需要指出,不要誤認為用static宣告的外部變數才採用靜態儲存方式(存放在靜態儲存區中),而不加static的是動態儲存(存放在動態儲存區)。實際上,兩種形式的外部變數都用靜態儲存方式,只是作用範圍不同而已,都是在編譯時分配記憶體的。

例:extern int i; // i全域性變數,靜態儲存方式 ,乙個變數宣告

static int x=3;     // x 靜態全域性變數,靜態儲存方式,不能被外部引用

int f(int a) //a為形參,自動變數,動態儲存方式

{int b,c=3; // b,c自動變數,動態儲存方式

static int d=3; // d靜態區域性變數,靜態儲存方式

}文章出處:飛諾網(www.diybl.com):

變數的儲存類別

從變數的作用域來分,變數可以分為全域性變數和區域性變數。在乙個函式內部定義的變數是區域性變數,它只是在本函式範圍內有效,在此函式外不能使用這些變數的。全域性變數可以供所有函式共用,它的有效範圍為從定義變數的位置開始到本原始檔結束。全域性變數的優點是 可以減少函式實參和形參的個數,從而減少記憶體空間以...

變數的儲存類別

儲存類別 是指資料在記憶體中的儲存方式 1 供使用者使用的儲存空間 程式區靜態儲存區 編譯時候分配空間,程式結束釋放空間。存放全域性變數 動態儲存區 定義時動態分配空間,對應函式完成時就釋放空間,再呼叫時又重新動態分配空間。存放auto型別區域性變數 2 儲存型別 auto,static,regis...

變數的儲存類別

普通區域性變數 自動變數 在乙個函式內定義,只在函式範圍內有效。在復合語句中定義,只在符合語句中有效。隨著函式呼叫的結束或復合語句的結束而消亡。如果沒有賦初值,則內容為隨機值。2.靜態區域性變數static 作用域 定義的函式內有效。生命週期 在定義的整個週期,靜態區域性變數始終從在著,即使退出函式...