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

2023-02-11 03:33:04 字數 2224 閱讀 8892

118848 0500 20 0other 15 013 868 00 0星級blog 0gyan#ffffff#187218 no-repeat _blank 144143 02010-09-13 21:33:41 144141 02010-09-13 21:

33:31"20100913","20100915","20100916","20100918","20100921","20100925","20100926","20101012","20101013",""2353730 144143 2010-10-13 21:47:

37 2010-10-13 21:47:37 10 0\r\n

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

\r\n

從作用域看:

\r\n

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

\r\n

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

\r\n

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

\r\n

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

\r\n

從分配記憶體空間看:

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

\r\n

\r\n

\r\n

全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。

而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

\r\n 1)、靜態變數會被放在程式的靜態資料儲存區(資料段)(全域性可見)中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。

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

\r\n

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

應予以注意。

\r\n tips:

a.若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

b.若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

c.設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;

d.如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶"內部儲存器"功能的的函式)

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

\r\n

---\r\n static全域性變數:改變作用範圍,不改變儲存位置

\r\n static區域性變數:改變儲存位置,不改變作用範圍

\r\n

靜態函式:在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。

\r\n

如果在乙個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式也稱為內部函式。定義乙個內部函式,只需在函式型別前再加乙個"static"關鍵字即可。

\r\n

]]1.02042

關於全域性變數的定義

在用vb開發軟體時,經常需要在不同的窗體間共享資料,但在過多的使用全域性變數時不便於軟體的除錯和修改。通常有兩種解決方法。第一種方法 定義全域性變數,然後在各個窗體中直接使用,例如 public strcustomerid as string public strcustomername as st...

全域性變數巨集定義 精

以下是如何定義全域性變數。眾所周知,全域性變數應該是得到記憶體分配且可以被其他模組通過c語言中extern關鍵字呼叫的變數。因此,必須在 c 和 h 檔案中定義。這種重複的定義很容易導致錯誤。error e46 undefined external serbfr referred in zlg522...

C程式設計中使用全域性變數應注意的事項

7 模組間的耦合性就是指當修改其中某個模組時會影起其他模組執行結果發生不 可預料的變化。如果模組間是通過直接呼叫對方內部的全域性變數來實現互動,則兩 個模組間的耦合性將會變得複雜而且難以控制。而模組間的互動通過乙個統一的接 口函式來實現,使得模組都無需知道對方模組內部的具體實現 這也就是物件導向 裡...