靜態變數 非靜態變數的區別

2021-09-30 14:31:46 字數 1252 閱讀 6135

c++變數根據定義位置的不同,具有不同的作用域,作用域可分為6種:全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。

從作用域看:

全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。

靜態區域性變數具有區域性作用域。它只被初始化一次,自從第一次初始化直到程式結束都一直存在,他和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。

區域性變數也只有區域性作用域,他是自動物件,他在程式執行期間不是一直存在,而是只在函式執行期間存在,函式的一次呼叫結束後,變數就被撤銷,其所占用的記憶體也被收回。

靜態全域性變數也具有全域性作用域,他與全域性變數的區別在於如果程式包含多個檔案的話,他作用於定義它的檔案裡,不能作用到其他檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同的靜態全域性變數,他們也是不同的變數。

從分配記憶體空間看:

全域性變數、靜態區域性變數、靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧分配空間。

全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上沒有什麼不同。區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其他原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其他原始檔中引起錯誤。

1、靜態變數會被放在程式的靜態資料儲存區里,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是他與堆疊變數和堆變數的區別

2、變數用static告知編譯器,自己僅僅在變數的作用域範圍內可見。這一點是他與全域性變數的區別。

從以上分析可以看出,把區域性變數改變為靜態變數後是改變了他的儲存方式,即改變了他的生存期。把全域性變數改變為靜態變數後是改變了他的作用域,限制了他的使用範圍,因此static這個說明符在不同的地方起的作用是不同的。

tips:

1、若全域性變數僅在單個檔案中訪問,則可以講這個變數修改為靜態全域性變數。

2、若全域性變數僅在單個函式中使用,則可以將這個變數修改為該函式的靜態區域性變數。

3、全域性變數、靜態區域性變數、靜態全域性變數都存放在靜態資料儲存區。

4、函式中必須要使用static變數的情況:當某函式的返回值為指標型別時,則必須是static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。

靜態變數和非靜態變數的區別

記憶體分配 靜態變數在應用程式初始化 被裝載 時,就存在於記憶體當中,直到它所在的類的程式執行結束時才消亡 而非靜態變數需要被例項化後才會分配記憶體。生存週期 靜態變數生存週期為應用程式的存在週期 非靜態變數的存在週期取決於例項化的類的存在週期。呼叫方式 靜態變數只能通過 類.靜態變數名 呼叫,類的...

靜態變數和非靜態變數

class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...

靜態變數與非靜態變數之間的區別

學習ios時候經常遇到有static修飾的變數和沒有static的變數,在ios中主要用到 它們之間的區別是 如 static nsstring identify identify 與nsstring identify identify 1 作用範圍不一樣,有static修飾的identity的內容...