全域變數與靜態變數
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中此關鍵字的含義相同)。
全域變數、靜態全域變數、靜態局部變數和局部變數的差異
變數可以分為:全域變數、靜態全域變數、靜態局部變數和局部變數。
依儲存區域分,全域變數、靜態全域變數和靜態局部變數都存放在記憶體的靜態儲存區域,局部變數存放在記憶體的堆疊區。
按作用域分,全域變數在整個工程檔案內都有效;靜態全域變數只在定義它的檔案內有效;靜態局部變數只在定義它的函數內有效,且程式只分配一次內存,函數返回後,該變數不會消失;局部變數在定義它的函數內有效,但是函數返回後失效。
全域變數(外部變數)的說明之前再冠以static 就構成了靜態的全域變數。全域變數本身就是靜態儲存方式, 靜態全域變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域變數的作用域是整個原始程序,當一個原始程式由多個來源檔案組成時,非靜態的全域變數在各個來源檔案中都是有效的。而靜態全域變數則限制了其作用域, 即只在定義該變數的來源檔案內有效, 在同一原始程式的其它來源檔案中不能使用它。由於靜態全域變數的作用域侷限於一個原始檔內,只能為該來源檔案內的函數公用, 因此可以避免在其它原始檔中造成錯誤。
從以上分析可以看出,把局部變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。
static函數與普通函數作用域不同,只在定義該變數的來源檔案內有效。只在目前原始檔中使用的函數應該說明為內部函數(static),內部函數應該在目前原始檔中說明和定義。對於可在目前原始檔以外使用的函數,應該在一個頭檔中說明,要使用這些函數的原始檔要包含這個頭檔。
static全域變數與普通的全域變數有什麼不同:static全域變數只初使化一次,防止在其他檔案單元中被引用;
static局部變數和普通局部變數有何不同:static局部變數只初始化一次,下次依據上一次結果值;
static函數與普通函數有何不同:static函數與一般函數作用域不同,只在定義該變數的來源文件內有效;
全域變數和靜態變數如果沒有手動初始化,則由編譯器初始化為0。局部變數的值不可知。
以上是靜態變數和全域變數的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!