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 還可以在多文件的程序中聲明外部變量。