C語言中的四種儲存型別
一、 首先來說說資料的型別,所有的資料都有兩種型別,一是常見的資料型別,如int,float等,一種便是今天的重頭戲,儲存型別。總共有四種儲存型別的變數,分別為自動變數(auto)、靜態變數(static)、外部變數(extern)以及暫存器變數(register)。
先回顧一下定義
1、自動變數:函式中所有的非靜態區域性變數。
2、靜態變數:在變數前加上static關鍵字的變數。
3、外部變數:一般用作全域性變數作用域的擴充套件(還有定義外部函式的時候前面也可以有一個extern關鍵字,具體外部函式請看下面)。
4、暫存器變數:一般經常被使用的的變數(如某一變數需要計算幾千次)可以設定成暫存器變數,register變數會被儲存在暫存器中,計算速度遠快於存在記憶體中的非register變數。
二、儲存變數關乎著變數的作用域和生存時間
1、從作用域(空間)的角度來看:
自動變數:其作用域僅僅侷限於其定義的函式中,儲存在動態儲存區,注意儲存在動態儲存區的資料,在沒有顯式初始化的時候,其變數的值是隨機的,無用的。
靜態變數:儲存在靜態儲存區,靜態變數包括靜態全域性變數和靜態區域性變數,靜態變數在沒有顯式初始化的時候會被初始化為0或者null,並且只初始化一次(初始化不等同於賦值)。
靜態全域性(外)變數:作用域只是在其定義的原始檔中有效,對外部變數起到了“遮蔽”的作用。
靜態區域性變數:其作用域是其定義的函式中。
外部變數:把全域性變數在其他原始檔中宣告成extern變數,可以擴充套件該全域性變數的作用域至宣告的那個檔案,其本質作用就是對全域性變數作用域的擴充套件。
暫存器變數:儲存在cpu的暫存器中,速度快,一般不需要程式設計師定義暫存器變數,這是由於一些編譯器會把需要參加很多次計算的變數轉化成暫存器變數,不允許程式設計師對暫存器變數的地址進行操作。
2、從生存時間的角度來看:
自動變數:隨著函式的進棧和出棧而建立和銷燬
靜態變數:長期存在靜態儲存區,直到程式結束
外部變數:長期存在靜態儲存區,直到程式結束
暫存器變數:離開函式值就會消失