靜態變數與全域性變數的區別

2021-10-03 18:18:10 字數 1260 閱讀 2792

靜態區域性變數和普通全域性變數以及靜態全集變數在編譯時,編譯器會自動給他們分配位址。而且是從mcu上電執行開始,一直駐留,不會被**的。

而真正的區別在於他們的作用域。

靜態區域性變數的作用域是在於定義它的那個函式內。由於其在編譯時編譯器就給他們分配了位址,並且做了初始化,所以它只能被初始化一次,而且看起來的順序是程式每執行到這個函式時,都會執行那條定義語句,其實 並!沒!有! 因為它已經被分配位址了,而且始終駐留在ram中。而剝離這點,其他特性都與普通的區域性變數相同。

普通全域性變數,在本檔案內可以被無限制地使用。而且其他的原始檔中,也可以通過extern關鍵字引用後使用。

而靜態全域性變數則是在普通全域性變數的基礎上,取消了extern關鍵字引用,即無論怎麼樣,只能給本檔案的程式使用,其他檔案不能使用。(保護**模組化,封閉外部介面)。

在變數的前面加上static 就構成了靜態變數(static 變數)。

static變數和普通變數的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用, 因此可以避免在其它原始檔中引起錯誤。

static全域性變數與普通全域性變數區別:static全域性變數只初使化一次,防止在其他檔案單元中被引用;

static區域性變數和普通區域性變數區別:static區域性變數只被初始化一次,下一次依據上一次結果值;

static函式與普通函式區別:static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝。

在全域性變數之前加上關鍵字static,全域性變數就被定義成為乙個全域性靜態變數。

1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)

2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)

3)作用域:全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。

注:當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。

當static用來修飾全域性變數的時候,它就改變了全域性變數的作用域(在宣告他的檔案之外是不可見的),但是沒有改變它的存放位置,還是在靜態儲存區中。

全域性變數與全域性靜態變數的區別

全域性變數與全域性靜態變數的區別 a 若程式由乙個原始檔構成時,全域性變數與全域性靜態變數沒有區別。b 若程式由多個原始檔構成時,全域性變數與全域性靜態變數不同 全域性靜態變數使得該變數成為定義該變數的原始檔所獨享,即 全域性靜態變數對組成該程式的其它原始檔是無效的。c 具有外部鏈結的靜態 可以在所...

全域性變數與全域性靜態變數的區別

全域性變數與全域性靜態變數的區別 a 若程式由乙個原始檔構成時,全域性變數與全域性靜態變數沒有區別。b 若程式由多個原始檔構成時,全域性變數與全域性靜態變數不同 全域性靜態變數使得該變數成為定義該變數的原始檔所獨享,即 全域性靜態變數對組成該程式的其它原始檔是無效的。c 具有外部鏈結的靜態 可以在所...

全域性變數與靜態變數

1.全域性變數 作用域為定義處到檔案末尾,但是在程式開始就占用記憶體了。include include 這樣是可以的 extern int g int k 10 int main int g 10 include include 這樣也是可以的,但是沒必要。int g 10 extern int g...