C語言中的 static變量、static函數


1. 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(……) /*定義外部函數*/
  {……} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM