變數的儲存位置與變數的型別有關,這裡變數的型別不是int、float之類的型別, 而是分為三類:靜態變數、自動變數和暫存器變數。
然而,變數到底屬於這三類中的哪一類是根據變數在原始檔中的宣告位置和宣告方式所決定的。
變數的儲存型別(storage class)是指儲存變數值的記憶體型別。變數的儲存型別決定變數何時建立、何時銷毀以及它的值將保持多久。有三個地方可以用於儲存變數:靜態記憶體、執行時堆疊、硬體暫存器。在這三個地方儲存的變數具有不同的特性。
凡是在任何**塊之外宣告的變數總是儲存於靜態記憶體中,也就是不屬於堆疊的記憶體,這類變數也叫靜態(static)變數。對於這類變數,你無法為它們指定其他儲存型別。
靜態變數的生存期:靜態變數在程式執行之前建立,在整個程式執行期間始終存在。
在**塊內部宣告的變數的預設儲存型別是自動的(automatic),也就是說它儲存於堆疊中,這類變數叫自動(auto)變數,也叫區域性變數。有乙個關鍵字auto就是用於修飾這種型別的,但它極少使用,因為**塊中的變數預設就是自動變數。
自動變數的生存期:在程式執行到宣告自動變數的**塊時,自動變數才被建立,當程式的執行流離開該**塊時,這些自動變數便自行銷毀。
如果該**塊被執行多次,例如乙個函式被執行多次,其內部的自動變數也就被重新建立多次。而且每次被建立的記憶體位址可能不同。
對於在**塊內部宣告的變數,預設為自動變數,但如果給它加上關鍵字static,可以使它的儲存型別從自動變為靜態。這類變數也叫做靜態區域性變數,儲存在靜態記憶體中。
靜態區域性變數的生存期:**塊首次執行時建立該變數,直到整個程式結束。
注意:雖然儲存型別發生變化,但它的作用域並為改變,它仍然只能在該**塊內部通過變數名訪問。函式的形式引數不能宣告為靜態,因為實參總是在堆疊中傳遞給函式,用於支援遞迴。
(4)在硬體暫存器中的變數
關鍵字register可以用於自動變數的宣告,提示它們應該儲存於機器的硬體暫存器而不是記憶體中,這類變數稱為暫存器變數。通常,暫存器變數比儲存於記憶體的變數訪問起來效率更高。
注意:宣告為暫存器變數只是一種美好的願望 ^_^,因為編譯器不一定會理你!
因為暫存器就那麼幾個,要是太多變數被宣告為register,它可不會都放進暫存器。它一般只選取前幾個實際儲存於暫存器中,其餘的原來怎樣還怎樣。 如果有些編譯器自己具有一套暫存器優化方案,他也可能忽略register關鍵字,依據是由編譯器決定哪些變數儲存於暫存器比你人腦的決定更為合理 ←_← !
暫存器變數
在程式執行時,根據需要到記憶體中相應的 儲存單元中呼叫,如果乙個變數在程式中頻繁使用,例如迴圈變數,那麼,系統就必須多次訪問記憶體中的該單元,影響程式的執行效率。因此,c c 語言還定義了一種變數,不是儲存在記憶體上,而是直接儲存在cpu中的暫存器中,這種變數稱為暫存器變數。暫存器變數的定義形式是 ...
暫存器變數
c語言中的變數按儲存區域可以分為三種 堆疊中的自動變數,普通記憶體中得靜態變數,硬體暫存器變數。由於暫存器變數直接存放在cpu中,而不在記憶體中,所以訪問速度極快。一般應用於需要大量次數訪問的變數。暫存器變數只能存放int char和指標型別的資料,而且暫存器變數不能過多的使用,否則反而會降低運算速...
暫存器變數
c c 語言定義了一種變數,不是儲存在記憶體上,而是直接儲存在 中的暫存器中,稱為暫存器變數 特點 讀取和改變的速度更快,高速 語法形式 register 型別識別符號 變數名 由於受硬體暫存器長度的限制,暫存器變數只能是char int或指標型。暫存器說明符只能用於說明中的變數和函式中的形參,因此...