全局變量與靜態變量

全局變量與靜態變量

static 聲明的變量在C語言中有兩方面的特徵:
1.變量被放在程序的全局存儲區中,這樣在下一次調用的時候還能夠保持原來的賦值。這一點是它與堆棧變量和堆變量的區別。
2.變量用static告知編譯器,本身僅在變量的做用範圍內可見。這一點是它與全局變量的區別。
Tips:
A.若全局變量僅在單個C文件中訪問,則能夠將這個變量修改成靜態全局變量,以下降模塊間的耦合度;
B.若全局變量僅由單個函數訪問,則能夠將這個變量改成該函數的靜態局部變量,以下降模塊間的耦合度;
C.設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,須要考慮重入問題;
D.若是咱們須要一個可重入的函數,那麼,咱們必定要避免函數中使用static變量(這樣的函數被稱爲:帶「內部存儲器」功能的的函數)
E.函數中必需要使用static變量的狀況:好比當某函數的返回值爲指針類型時,則必須是static的局部變量的地址做爲返回值,若爲auto類型,則返回爲錯指針。函數

函數前加static使得函數成爲靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的做用域僅侷限於本文件(因此又稱內部函數)。使用內部函數的好處是:不一樣的人編寫不一樣的函數時,不用擔憂本身定義的函數,是否會與其它文件中的函數同名。設計

擴展分析:術語static有着不尋常的歷史。起初,在C中引入關鍵字static是爲了表示退出一個塊後仍然存在的局部變量。隨後,static在C中有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。最後,C++重用了這個關鍵字,並賦予它與前面不一樣的第三種含義:表示屬於一個類而不是屬於此類的任何特定對象的變量和函數(與Java中此關鍵字的含義相同)。指針

全局變量、靜態全局變量、靜態局部變量和局部變量的區別對象

變量能夠分爲:全局變量、靜態全局變量、靜態局部變量和局部變量。ip

按存儲區域分,全局變量、靜態全局變量和靜態局部變量都存放在內存的靜態存儲區域,局部變量存放在內存的棧區。內存

按做用域分,全局變量在整個工程文件內都有效;靜態全局變量只在定義它的文件內有效;靜態局部變量只在定義它的函數內有效,而且程序僅分配一次內存,函數返回後,該變量不會消失;局部變量在定義它的函數內有效,可是函數返回後失效。作用域

全局變量(外部變量)的說明以前再冠以static 就構成了靜態的全局變量。全局變量自己就是靜態存儲方式, 靜態全局變量固然也是靜態存儲方式。 這二者在存儲方式上並沒有不一樣。這二者的區別在於非靜態全局變量的做用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其做用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。因爲靜態全局變量的做用域侷限於一個源文件內,只能爲該源文件內的函數公用, 所以能夠避免在其它源文件中引發錯誤。
從以上分析能夠看出,把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的做用域,限制了它的使用範圍。編譯器

static函數與普通函數做用域不一樣,只在定義該變量的源文件內有效。只在當前源文件中使用的函數應該說明爲內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件之外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件。編譯

static全局變量與普通的全局變量有什麼區別:static全局變量只初使化一次,防止在其餘文件單元中被引用;
static局部變量和普通局部變量有什麼區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數與普通函數做用域不一樣,只在定義該變量的源文件內有效;變量

全局變量和靜態變量若是沒有手工初始化,則由編譯器初始化爲0。局部變量的值不可知。

相關文章
相關標籤/搜索