static全域性變數和普通全域性變數區別?static區域性變數和普通區域性變數區別?static函式和普通函式區別
阿新 • • 發佈:2019-02-02
幾者的區別從三個方面考慮:
1初始化時間
2 作用域
3 分配記憶體空間
static全域性變數和普通全域性變數區別:
區別:
1.static全域性變數編譯是初始化,在main()函式之前初始化並且僅初始化一次;
2.static全域性變數限定了作用範圍,僅在定義該變數的原始檔中有效,由於靜態全域性變數的作用域侷限於一個原始檔內,即檔案作用域,只能為該原始檔內的函式公用, 因此可以避免在其它原始檔中引起錯誤。全域性變數可以跨越多個原始檔有效,當然,其他不包含全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數
相同點:都是全域性作用域,靜態儲存方式
static區域性變數和普通區域性變數區別:
區別
1.static區域性變數只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在。普通區域性變數,只在函式執行期間存在,函式的一次呼叫執行結束後,變數被撤銷,其所佔用的記憶體也被收回。
2.靜態區域性變數在靜態儲存區分配空間,區域性變數在棧裡分配空間。
相同點:兩者都只有區域性作用域
static函式和普通函式區別:
區別
1.普通函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。好處:其他檔案中可以定義相同名字的函式,不會發生衝突。
2.普通函式在C++類中編譯後帶一個隱藏的this引數,而static函式不帶。
相同的
全域性變數、靜態全域性變數以及靜態區域性變數都會被放在程式的靜態資料儲存區(全域性可見)中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它們與堆變數、堆變數的區別。
而區域性變數在棧裡分配空間
從以上分析可以看出,把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static這個說明符在不同的地方所起的作用是不同的。應予以注意。