小議C語言中資料的儲存型別

2021-06-05 10:42:38 字數 1700 閱讀 5569

華清遠見嵌入式學院

講師。c語言中的一些說明和定義會用到儲存型別這樣乙個概念,在c語言中儲存型別會用到下述幾個關鍵字:auto,static,register,extern。

看下面的簡略圖大家可以明確程式在進行儲存時是分為三個區域的,分別為**段,資料段和bss段,用於儲存不同型別和狀態的變數,而執行起來系統會再為其新增2個段,乙個是堆,乙個是棧,而我們手動進行的記憶體空間的申請是分配在堆區中的,棧區中存放的是程式在執行的過程中產生出來的一些臨時資訊和資料。我們依次來看一下這4個關鍵字的使用和區別。

auto儲存型別說明的變數都是區域性於某個程式範圍內的,只能在某個程式範圍內使用,通常在函式體內或函式中的復合語句裡。c語言中,在函式體的某程式段內說明auto儲存型別的變數時可以省略關鍵字auto。

如,有下述定義:

auto int  k ;        //說明乙個auto整型的k變數

int  k ;        //省略了auto,說明乙個auto整型的k變數

這2種定義方式是相同的,省略auto關鍵字也是我們常用的方式。

static:稱為靜態儲存型別,在c語言中,既可以在函式體內,也可在函式體外說明static 儲存型別的變數。

在函式體內說明的static 儲存型別的變數也是一種區域性變數,與auto最大不同點是:static儲存型別的變數在記憶體中是以固定位址存放的,而不是以堆疊方式存放的;只要整個程式還在繼續執行靜態變數就不會隨著說明它的程式段的結束而消失,static型別的變數只被初始化一次,且變數的值有繼承性,如,有下面的程式段:

void fun()

int main()

在主函式中3次呼叫fun函式,這時在終端上輸出的內容為:11

1而我們將程式更改一下,將帶有*的語句換作:

static int  i = 0;

則程式在終端上的輸出為:12

3這是static關鍵字的用法及特點。

extern稱為外部參照引用型,使用extern說明的變數是想引用在其它檔案中或在函式體外部已經宣告過的變數

這裡會涉及到乙個概念,叫全域性變數,指的是在所有的函式外部宣告的變數,全部變數作用於全域性,在整個程式執行期間值都被儲存,全域性變數的作用範圍是從其定義處開始,直至程式結束,而extern關鍵字的作用是對全域性變數進行引用的宣告。如下面的程式:

int a = 1;

int  main()

該程式可以成功執行,輸出a的值為1,而如果改變一下:

int  main()

int a = 1;

extern  a;

int  main()

int a = 1;

加上乙個extern的說明後,該程式可以正常編譯執行,在這裡要注意extern關鍵字對於變數的型別說明可以省略,但對於變數的型別及值是沒有任何改變許可權的,也就是說在上面例子中的extern語言如果寫成exter float a;或者是extern int a = 3;編譯時會提示錯誤。

所以extern對於變數的型別及值沒有任何更改的功能,只能是對於外部變數的定義進行乙個引用的宣告,換句話說,它擴大了外部變數的作用範圍,所以extern是乙個說明性關鍵字,而不是定義性的,說明與定義的區別我們可以來對比一下:

c語言中的儲存型別

auto 自動型別 在定義變數的時候,變數前預設就是auto auto int a 等於 int a 非自動型別的變數 1.全域性變數 2.static修飾的變數 register 暫存器型別的變數 register int a 暫存器型別的變數,要不普通的變數執行效率要高。在乙個soc syste...

C語言中變數的儲存型別

變數的儲存型別 storage class 是指儲存變數值的記憶體型別。有三個地方可以用於儲存變數 普通記憶體 執行時堆疊 硬體暫存器 用於宣告變數儲存型別的關鍵字 auto static register 在所有 塊之外的變數的預設儲存型別是靜態的 static 儲存於靜態記憶體中,稱為靜態 st...

小議C語言中的陣列和指標

1.引言 在c語言中,陣列和指標是其中非常重要又聯絡緊密的兩種資料型別,同時也是重點難點集中的地方。在學習這些內容時,經常會碰到這樣一些問題,例如 陣列名是什麼,就是首位址嗎?陣列如何訪問元素?陣列為什麼不能進行越界檢查?陣列表示法和指標表示法有何關係,誰更好?正確理解這些問題,對指標和陣列的使用是...