1. static
變數靜態變數的型別
說明符是
static
。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。
例如外部變數雖屬於靜態
儲存方式,但不一定是靜態變數,必須由
static
加以定義後才能成為靜態外部變數,或稱靜態全域性變數。
2. 靜態區域性變數
靜態區域性變數屬於靜態儲存方式,它具有以下特點:
(1)靜態區域性變數在函式內定義
它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式內使用該變數。退出該函式後,
儘管該變數還繼續存在,但不能使用它。
(2)允許對構造類靜態區域性量賦初值
例如陣列,若未賦以初值,則由系統自動賦以0值。
(3)對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予
0值。而對自動變數不賦初值,則其值是不定的。
根據靜態區域性變數的特點,
可以看出它是一種生存期為整個源程式的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用,
而且儲存了前次被呼叫後留下的
值。因此,當多次呼叫乙個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成
意外的***,因此仍以採用區域性靜態變數為宜。
3.靜態全域性變數
全域性變數
(外部變數
)的說明之前再冠以
static
就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,
靜態全域性變數當然也是靜態儲存方式。
這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性
變數的作用域是整個源程式,
當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。
而靜態全域性變數則限制了其作用域,
即只在定義該變數的原始檔內有效,
在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,
因此可以避免在其它原始檔中引起錯誤。從以上分析可以看出,
把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數
後是改變了它的作用域,
限制了它的使用範圍。因此
static
這個說明符在不同的地方所起的作用是不同的。
變數可以分為:全域性變數、靜態全域性變數、靜態區域性變數和區域性變數
按儲存區域分,全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的靜態儲存區域,區域性變數存放在記憶體的棧區。
按作用域分,全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但是函式返回後失效。
全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。
從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。
4. static
函式…..
內部函式和外部函式
當乙個源程式由多個原始檔組成時,c語言根據函式能否被其它原始檔中的函式呼叫,將函式分為內部函式和外部函式。
1 內部函式(又稱靜態函式)
如果在乙個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式稱為內部函式。
定義乙個內部函式,只需在函式型別前再加乙個
「static」
關鍵字即可,如下所示:
static
函式型別
函式名(
函式引數表
)關鍵字
「static」
,譯成中文就是
「靜態的
」,所以內部函式又稱靜態函式。但此處
「static」
的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。
使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。
2 外部函式
外部函式的定義:在定義函式時,如果沒有加關鍵字
「static」
,或冠以關鍵字
「extern」
,表示此函式是外部函式:
[extern]
函式型別
函式名(
函式引數表
)呼叫外部函式時,需要對其進行說明:
[extern]
函式型別
函式名(
引數型別表
)[,函式名
2(引數型別表
2)……]
;static
函式與普通函式作用域不同。僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案
static全域性變數與普通的全域性變數有什麼區別:static全域性變數只初使化一次,防止在其他檔案單元中被引用;
static區域性變數和普通區域性變數有什麼區別:static區域性變數只被初始化一次,下一次依據上一次結果值;
static函式與普通函式有什麼區別:static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝
全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。
C中static的作用
在c語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。1 先來介紹它的第一條也是最重要的一條 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。...
C 中static的作用
1 static可修飾的成員 首先我們先說以下static可修飾的成員 區域性變數 在區域性變數之前加上關鍵字static,區域性變數就稱為乙個區域性靜態變數,區域性靜態變數在記憶體中的位置 靜態儲存區 函式 在函式返回型別面前加static,函式就定義為靜態函式,靜態函式知識在宣告他的檔案當中可見...
C 中Static的作用
static關鍵字,在c 中可以用來修飾變數和函式,變數又分為全域性變數 區域性變數 成員變數,而函式也分為普通函式和成員函式,下面具體說說不同使用情況下的作用。static修飾全域性靜態變數後 1 在全域性資料區內分配記憶體 2 如果沒初始化預設值為0 3 該變數在檔案內可見 1 仍在全域性資料區...