本文討論c語言中的儲存類別,包括資料在記憶體的儲存、變數的儲存類別、函式的儲存類別、生存週期。下圖為計算機的儲存空間,有暫存器和記憶體。
一、儲存區域
1.暫存器:存放立即參加運算的資料。
2.系統區:存放系統軟體。
3.使用者程式**區:存放使用者程式的程式**。
4.庫程式**區:存放庫函式的**。
5.資料區,分為堆區、棧區和靜態儲存區。
(1)堆區:存放動態變數,即由malloc申請的動態變數。
(2)棧區:存放自動儲存型別的變數,包括函式和復合語句中的區域性變數等。
(3)靜態儲存區:存放具有顯式宣告的靜態型別的變數。
二、變數的儲存類別
1.靜態變數
靜態變數:這裡的靜態指的一般程式語言概念中的靜態變數,即程式中顯式宣告的變數。靜態變數有乙個名字,在編譯時,編譯程式已經給靜態變數分配了記憶體空間。
靜態變數的儲存型別分為兩大類:靜態(包括static和extern)和自動(包括auto)
auto:自動儲存類別,預設的儲存類別
儲存在棧區,作用域在宣告它的函式和復合語句中。auto具有本地生存期,當宣告自動變數的個體執行結束,自動變數結束生存週期,不再存在。
auto intstatic:靜態儲存類別儲存在靜態儲存區。靜態變數分為靜態區域性變數和靜態全域性變數。i;int j;//
預設為auto儲存類別
靜態區域性變數:具有本地生存期,生存週期是整個程式,在程式結束後,生存期結束並被刪除。但作用域僅在宣告它的個體中。離開復合語句或函式,靜態變數依然存在但不能被訪問。再次進入宣告該靜態變數的個體時,可以繼續使用,而且保留淺一些使用留下的值。靜態區域性變數只能在開始時初始化一次。
全域性區域性變數:生存週期是包含它宣告的整個程式檔案,可隨時訪問。
//作用域僅在復合語句內,同autoextern外部儲存類別盡可用作全域性變數的儲存型別。儲存在靜態儲存區。在頂層宣告中,extern是預設儲存類別,所有未加extern的全域性變數均被視為外部變數。在使用其他檔案的外部變數時,使用extern說明符,這樣在連線時分配相同的儲存區,占用相同的儲存空間。若兩個檔案中的同名全域性變數都沒有使用extern,會在連線時出現錯誤,因為他們都被宣告成全域性的外部變數,都分配了儲存空間,產生衝突。//離開復合語句,靜態區域性變數存在但不能被使用,值保持上一次的使用
檔案1:
int a;//檔案2extern是全域性變數預設的儲存類別
extern注:register暫存器儲存型別可以顯式宣告,表明變數要分配在計算機cpu中的暫存器中,對於頻繁訪問的變數,可以節約時間,提高程式執行效率。但是,暫存器數量很有限,若暫存器邊納涼太多,將被認為是auto型別。int a;//
使用檔案1的區域性變數,占用相同儲存空間
2.動態變數
動態變數:是指使用申請空間函式(如malloc)動態申請的空間,存放在堆區。動態變數沒有顯式宣告,在編譯的時候不分配(也無法分配)空間。在程式執行時,動態變數由指標標識。使用完畢後,使用釋放空間函式(如free)等釋放。動態函式具有動態生存期,生存週期是顯式實現的。
float *p;三、函式的儲存類別c語言的函式可以被定義成static和extern兩種儲存類別。p=(float*)malloc(sizeof(float));//
生存週期開始
...free(p);//
生存週期結束
static:內部函式
與變數的static儲存類別相區別。內部函式的作用域呼叫範圍僅限於本檔案,在不同原始檔中的同名靜態函式不會混淆。
extern:外部函式
函式預設的儲存類別。外部函式在乙個原始檔中被定義,在其他原始檔可以使用。在乙個源程式檔案中呼叫其它源程式檔案中定義的外部函式時,必須在本原始檔中用函式原型說明它,並加上extern字首。
所有的函式都具有靜態生存期,即分配的空間在程式執行前開始,保持到程式執行結束為止。
檔案1:
int f(float x)//檔案2:函式預設的儲存類別是外部函式
externint f(foat);//
使用外部函式
C語言儲存類別
1.作用域 在c語言中,變數的作用域可以是塊作用域 函式作用域 函式原型作用域或檔案作用域 塊作用域變數也能具有靜態存出期,只需要在宣告變數的時候,在宣告前加上關鍵字static 3.自動變數 屬於自動儲存類別的變數具有自動儲存週期 塊作用域且無鏈結,預設情況下,宣告在塊中或函式頭中的任何變數都屬於...
C語言變數儲存類別
變數除了型別屬性 int char float.外,另外乙個重要屬性就是儲存類別 系統把程式中用到的資料區分為靜態儲存區和動態儲存區。靜態儲存區 在這個區分配了空間的變數,在程式執行過程中一直存在,即相對是不變的。動態儲存區 在這個區分配了空間的變數,可能隨時被釋放,即相對是不斷變化的。c語言提供了...
C語言的儲存類別
前面已經介紹了,從變數的作用域 即從空間 角度來分,可以分為全域性變數和區域性變數。從另乙個角度,從變數值存在的作時間 即生存期 角度來分,可以分為 靜態儲存方式 和動態儲存方式。使用者儲存空間可以分為三個部分 程式區 靜態儲存區 動態儲存區。全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性...