C C 中的儲存類別

2021-10-04 07:15:23 字數 1712 閱讀 8980

c提供了多種不同的模型或儲存類別(storage class)在記憶體中儲存數 據。要理解這些儲存類別,先要複習一些概念和術語。

本書目前所有程式設計示例中使用的資料都儲存在記憶體中。從硬體方面來 看,被儲存的每個值都占用一定的物理記憶體,c 語言把這樣的一塊記憶體稱為 物件(object)。物件可以儲存乙個或多個值。乙個物件可能並未儲存實際 的值,但是它在儲存適當的值時一定具有相應的大小(物件導向程式設計中的對 象指的是類物件,其定義包括資料和允許對資料進行的操作,c不是面向對 象程式語言)。

從軟體方面來看,程式需要一種方法訪問物件。這可以通過宣告變數來 完成:

int entity =

3;

該宣告建立了乙個名為entity的識別符號(identifier)。識別符號是乙個名 稱,在這種情況下,識別符號可以用來指定(designate)特定物件的內容。標 識符遵循變數的命名規則。在該例中,識別符號entity即是軟 件(即c程式)指定硬體記憶體中的物件的方式。該宣告還提供了儲存在物件 中的值。

變數名不是指定物件的唯一途徑。考慮下面的宣告:

int

* pt =

&entity;

int ranks[10]

;

第1行宣告中,pt是乙個識別符號,它指定了乙個儲存位址的物件。但 是,表示式*pt不是識別符號,因為它不是乙個名稱。然而,它確實指定了一 個物件,在這種情況下,它與 entity 指定的物件相同。一般而言,那些指定 物件的表示式被稱為左值。所以,entity既是識別符號也是左值;pt既是表示式也是左值。按照這個思路,ranks + 2 * entity既不是識別符號 (不是名稱),也不是左值(它不指定記憶體位置上的內容)。但是表示式 (ranks + 2 * entity)是乙個左值,因為它的確指定了特定記憶體位置的值,即 ranks陣列的第7個元素。順帶一提,ranks的宣告建立了乙個可容納10個int類 型元素的物件,該陣列的每個元素也是乙個物件。

所有這些示例中,如果可以使用左值改變物件中的值,該左值就是乙個 可修改的左值(modifiable lvalue)。現在,考慮下面的宣告:

const

char

* pc =

"behold a string literal!"

;

程式根據該宣告把相應的字串字面量儲存在記憶體中,內含這些字元值 的陣列就是乙個物件。由於陣列中的每個字元都能被單獨訪問,所以每個字 符也是乙個物件。該宣告還建立了乙個識別符號為pc的物件,儲存著字串的 位址。由於可以設定pc重新指向其他字串,所以識別符號pc是乙個可修改的 左值。const只能保證被pc指向的字串內容不被修改,但是無法保證pc不指 向別的字串。由於pc指定了儲存』b』字元的資料物件,所以pc 是乙個左 值,但不是乙個可修改的左值。與此類似,因為字串字面量本身指定了儲 存字串的物件,所以它也是乙個左值,但不是可修改的左值。

可以用儲存期(storage duration)描述物件,所謂儲存期是指物件在內 存中保留了多長時間。識別符號用於訪問物件,可以用作用域(scope)和鏈 接(linkage)描述識別符號,識別符號的作用域和鏈結表明了程式的哪些部分可 以使用它。不同的儲存類別具有不同的儲存期、作用域和鏈結。識別符號可以 在源**的多檔案中共享、可用於特定檔案的任意函式中、可僅限於特定函 數中使用,甚至只在函式中的某部分使用。物件可存在於程式的執行期,也 可以僅存在於它所在函式的執行期。對於併發程式設計,物件可以在特定執行緒的 執行期存在。可以通過函式呼叫的方式顯式分配和釋放記憶體。

C C 中的變數儲存類別以及記憶體分配

1.變數的儲存類別 從變數值存在的角度來分,可以分為靜態儲存方式和動態儲存方式。所謂靜態儲存方式指在程式執行期間由系統分配固定的儲存空間的方式 程式開始執行時分配,在程式完畢時釋放,在程式過程中它們佔據國定的儲存單元,而不是動態分配和釋放 而動態儲存方式在執行期間根據需要進行動態儲存方式 在程式過程...

變數的儲存類別

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

資料的儲存類別

對乙個資料的定義,需要指定兩種屬性 資料型別和儲存類別,分別使用兩個關鍵字。例如 static int a 靜態區域性整型變數或靜態外部整型變數 auto char c 自動變數,在函式內定義 register int d 暫存器變數,在函式內定義此外,可以用extern宣告已定義的外部變數,例如 ...