一、變數
在將變數前,先解釋一下宣告和定義這兩個概念。宣告一個變數意味著向編譯器描述變數的型別,但並不為變數分配儲存空間。定義一個變數意味著在宣告變數的同時還要為變數分配儲存空間。在定義一個變數的同時還可以對變數進行初始化。
區域性變數通常只定義不宣告,而全域性變數多在原始檔中定義,在標頭檔案中宣告。
區域性變數
在一個函式的內部定義的變數是內部變數,它只在本函式範圍內有效。
自動變數auto
函式中的區域性變數,其預設格式是自動變數型別。例如,在函式體中int b, c=3; 和auto int b, c=3; 是等價的。
自動變數是動態分配儲存空間的,函式結束後就釋放。自動變數如不賦初值,則它的值是一個不確定的值。
靜態區域性變數static
靜態區域性變數是指在函式體內宣告和定義的區域性變數,它僅供本函式使用,即其他函式不能呼叫它。靜態區域性變數的值在函式呼叫結束後不消失而保留原值,即其佔用的儲存單元不釋放,在下一次函式呼叫時,該變數已有值,就是上一次函式呼叫結束時的值。
靜態區域性變數在靜態儲存區分配儲存單元,在程式的整個執行期間都不釋放。靜態區域性變數是在編譯時賦初值的,即只賦初值一次。
在SDT編譯器中,建議對靜態區域性變數賦初值,否則該靜態區域性變數的初值為不確定值。在其他編譯器中,未初始化的靜態區域性變數的初值可能為零,這由具體的編譯器所決定,使用前最好測試一下。
暫存器變數register
帶register修飾符的變數暗示(僅僅是暗示而不是命令)編譯程式本變數將被頻繁使用,如果可能的話,應將其保留在CPU的暫存器中,以加快其存取速度。
對於現有的大多數編譯程式,最好不要使用register修飾符。因為它是對早期低效的C編譯程式的一個很有價值的補充。隨著編譯程式技術的進步,在決定哪些變數應當被存到暫存器中時,現在的C編譯程式能比程式設計師做出更好的決定。
全域性變數
在函式之外定義的變數稱為外部變數,外部變數是全域性變數,它可以為本檔案中其他函式所共用。全域性變數都是靜態儲存方式,都是在編譯時分配記憶體,但是作用範圍有所不同。
靜態外部變數static
靜態外部變數只能在本檔案中使用。所以靜態外部變數應該在當前原始檔中宣告和定義。
外部變數extern
定義函式中的全域性變數時,其預設格式是外部變數型別。外部變數應該在一個頭檔案中宣告,在當前原始檔中定義。外部變數允許其他檔案引用。
下例聲明瞭一個變數和一個結構,定義了兩個變數,其中一個定義帶初始化:
extern int   decl1;   // this is a declaration