變數的屬性
1、變數的分類
l 根據範圍:可分為全域變數和局部變數。
l 根據生存周期:可分為靜態儲存方式和動態儲存裝置方式,具體地又分為自動的(auto)、靜態(static)、寄存器的(register)、外部的(extern)。
靜態儲存方式是指在程式運行期間分配固定的儲存空間的方式,動態儲存裝置方式是在程式運行期間根據需要進行動態分配儲存空間的方式。
2、變數的範圍和儲存類別的關係
每一個變數均有範圍和儲存類別兩個屬性,這些屬性共同用於描述一個變數,這些不同類型的變數與儲存位置的關係如下:
l 外部變數(全域變數)、靜態外部變數、靜態局部變數儲存在靜態儲存區。
l 自動局部變數(局部變數預設為自動局部變數)、函數形參儲存在動態儲存裝置區(即棧區)。
l 不論是靜態儲存區還是動態儲存裝置區均屬於記憶體中的使用者區。
l 而寄存器變數是儲存在CPU寄存器中的而不是記憶體中。
3、與範圍相關的幾個屬性:
l 局部變數:在一個函數內部定義的變數是內部變數,它只在本函數範圍內有效,也就是說只有在本函數內才能使用它們,在此函數以外是不能使用這些變數的,這種類型的變數就稱為“局部變數”。
l 全域變數:在函數外定義的變數,可以為本源檔案中其它函數所公用,有效範圍為從定義變數的位置開始到本源檔案結束,這種類型的變數就稱為“全域變數”。
4、與儲存類型相關的幾個屬性:
l atuo:在聲明局部變數時,若不指定 static,預設均是 auto,這類變數都是動態分配儲存空間的,資料存放區在動態儲存裝置區中。
l static:在聲明局部變數時,使用關鍵字 static 將局部變數指定為“靜態局部變數”,這樣在函數調用結束後不消失而保留原值,即佔用的儲存單元不釋放,在下一次函數調用時,該變數已有值就是上次函數調用結束時的值。
l register:在聲明動態局部變數或者函數形參時,可將變數聲明為register,這樣編譯系統就會為變數分配一個寄存器而不是記憶體空間,通過這種方式可提升對某些局部變數頻繁調用的程式的效能。(寄存器運算速度遠高於記憶體)
l extern:用於擴充全域變數的範圍。
1) 比如如果函數想引用一個外部變數,但該外部變數在該函數後定義,那麼這個函數需要使用 extern 來聲明變數,這樣才能使用在該函數後面定義的全域變數。
2) 此外,extern 還可以在多檔案的程式中聲明外部變數。
轉自:http://blog.csdn.net/21aspnet/article/details/2560072