C語言中的 static變數、static函式
C語言中的 static變數、static函式
static 變數
靜態變數的型別 說明符是static。 靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。 例如外部變數雖屬於靜態 儲存方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。
2. 靜態區域性變數
靜態區域性變數屬於靜態儲存方式,它具有以下特點:
(1)靜態區域性變數在函式內定義 它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還繼續存在,但不能使用它。
(2)允許對構造類靜態區域性量賦初值 例如陣列,若未賦以初值,則由系統自動賦以0值。
(3)對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。 根據靜態區域性變數的特點, 可以 看出它是一種生存期為整個源程式的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用, 而且儲存了前次被呼叫後留下的 值。 因此,當多次呼叫一個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成 意外的副作用,因此仍以採用區域性靜態變數為宜。
3.靜態全域性變數
全域性變數(外部變數)的說明之前再冠以static 就構 成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性 變數的作用域是整個源程式, 當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在 定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用, 因此 可以避免在其它原始檔中引起錯誤。從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數 後是改變了它的作用域, 限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。
4. static 函式…..
內部函式和外部函式
當一個源程式由多個原始檔組成時,C語言根據函式能否被其它原始檔中的函式呼叫,將函式分為內部函式和外部函式。
1 內部函式(又稱靜態函式)
如果在一個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式稱為內部函式。
定義一個內部函式,只需在函式型別前再加一個“static”關鍵字即可,如下所示:
static 函式型別 函式名(函式參數列)
{……}
關鍵字“static”,譯成中文就是“靜態的”,所以內部函式又稱靜態函式。但此處“static”的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。
使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。
2 外部函式
外部函式的定義:在定義函式時,如果沒有加關鍵字“static”,或冠以關鍵字“extern”,表示此函式是外部函式:
[extern] 函式型別 函式名(函式參數列)
{……}
呼叫外部函式時,需要對其進行說明:
[extern] 函式型別 函式名(引數型別表)[,函式名2(引數型別表2)……];
案例]外部函式應用。
(1)檔案mainf.c
main()
{ extern void input(…),process(…),output(…);
input(…); process(…); output(…);
}
(2)檔案subf1.c
……
extern void input(……) /定義外部函式/
{……}
(3)檔案subf2.c
……
extern void process(……) /定義外部 函式/
{……}
(4)檔案subf3.c
……
extern void output(……) /定義外部函式/
{……}
相關文章
- static在C語言中的作用C語言
- 函式的靜態變數 static函式變數
- C 語言中 static 的作用介紹
- C語言中的static 詳細分析C語言
- C語言中static關鍵字詳解C語言
- static變數變數
- static變數,static程式碼塊,建構函式,程式碼塊等的載入順序變數C程式函式
- Sanic static() 方法/函式函式
- 建構函式、this、static函式
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- C++ static、const和static const變數 以及它們的初始化C++變數
- Java 學習(09)--方法過載/建構函式/static 變數Java函式變數
- C語言中變參函式傳參探究C語言函式
- static靜態變數的理解變數
- C 語言中的 time 函式函式
- C語言中的abort函式C語言函式
- C++ static variable(靜態變數) 學習C++變數
- Spring 注入static變數Spring變數
- Java static變數、作用域、建構函式初始化順序Java變數函式
- C語言中qsort函式的用法C語言函式
- static函式塊中如何呼叫外部xml引數?函式XML
- 反射修改 static final 變數反射變數
- C語言之static關鍵字C語言
- C#staticC#
- 關於web應用的static變數Web變數
- C語言中函式printf()和函式scanf()的用法C語言函式
- c語言static關鍵字的理解C語言
- C語言中函式的返回值C語言函式
- 淺談C語言中函式的使用C語言函式
- 筆試題 類中static變數筆試變數
- 理解C++ staticC++
- 輸出C語言中 變數的型別C語言變數型別
- c語言中的變數儲存區域C語言變數
- linux下C語言中的mkdir函式與rmdir函式LinuxC語言函式
- C和C++中的staticC++
- c語言變數的作用域,連結屬性,儲存型別&&static關鍵字C語言變數型別
- 淺析C語言中的setjmp與longjmp函式C語言函式
- 詳細對比C語言中的chmod()函式和fchmod()函式C語言函式