全局變量、局部變量、靜態全局變量、靜態局部變量的區別函數
C++變量根據定義的位置的不一樣的生命週期,具備不一樣的做用域,做用域可分爲6種:全局做用域,局部做用域,語句做用域,類做用域,命名空間做用域和文件做用域。設計
從做用域看:指針
全局變量具備全局做用域。全局變量只需在一個源文件中定義,就能夠做用於全部的源文件。固然,其餘不包含全局變量定義的源文件須要用extern 關鍵字再次聲明這個全局變量。對象
靜態局部變量具備局部做用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和全局變量的區別在於全局變量對全部的函數都是可見的,而靜態局部變量只對定義本身的函數體始終可見。生命週期
局部變量也只有局部做用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是隻在函數執行期間存在,函數的一次調用執行結束後,變量被撤銷,其所佔用的內存也被收回。ip
靜態全局變量也具備全局做用域,它與全局變量的區別在於若是程序包含多個文件的話,它做用於定義它的文件裏,不能做用到其它文件裏,即被static關鍵字修飾過的變量具備文件做用域。這樣即便兩個不一樣的源文件都定義了相同名字的靜態全局變量,它們也是不一樣的變量。內存
從分配內存空間看: 全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧裏分配空間作用域
全局變量自己就是靜態存儲方式, 靜態全局變量固然也是靜態存儲方式。這二者在存儲方式上並沒有不一樣。這二者的區別雖在於非靜態全局變量的做用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其做用域, 即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。因爲靜態全局變量的做用域侷限於一個源文件內,只能爲該源文件內的函數公用,所以能夠避免在其它源文件中引發錯誤。編譯器
1)、靜態變量會被放在程序的靜態數據存儲區(數據段)(全局可見)中,這樣能夠在下一次調用的時候還能夠保持原來的賦值。這一點是它與堆棧變量和堆變量的區別。 2)、變量用static告知編譯器,本身僅僅在變量的做用範圍內可見。這一點是它與全局變量的區別。編譯
從以上分析能夠看出, 把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的做用域,限制了它的使用範圍。所以static 這個說明符在不一樣的地方所起的做用是不一樣的。應予以注意。
Tips: A.若全局變量僅在單個C文件中訪問,則能夠將這個變量修改成靜態全局變量,以下降模塊間的耦合度; B.若全局變量僅由單個函數訪問,則能夠將這個變量改成該函數的靜態局部變量,以下降模塊間的耦合度; C.設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,須要考慮重入問題,由於他們都放在靜態數據存儲區,全局可見; D.若是咱們須要一個可重入的函數,那麼,咱們必定要避免函數中使用static變量(這樣的函數被稱爲:帶「內部存儲器」功能的的函數) E.函數中必需要使用static變量狀況:好比當某函數的返回值爲指針類型時,則必須是static的局部變量的地址做爲返回值,若爲auto類型,則返回爲錯指針。
-----------------------------------------------------------------------------------------------------------
static 全局變量:改變做用範圍,不改變存儲位置
static 局部變量:改變存儲位置,不改變做用範圍
靜態函數 :在函數的返回類型前加上static關鍵字,函數即被定義爲靜態函數。靜態函數與普通函數不一樣,它只能在聲明它的文件當中可見,不能被其它文件使用。
若是在一個源文件中定義的函數,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用,這種函數也稱爲內部函數。定義一個內部函數,只需在函數類型前再加一個「static」關鍵字便可。