C語言之靜態變量


1、靜態局部變量

  有時候,我們希望函數中局部變量的值在函數調用結束之后不會消失,而仍然保留其原值。即它所占用的存儲單元不釋放,在下一次調用該函數時,其局部變量的值仍然存在,也就是上一次函數調用結束時的值。這時候,我們就應該將該局部變量用關鍵字 static 聲明為“靜態局部變量”。

  當將局部變量聲明為靜態局部變量的時候,也就改變了局部變量的存儲位置,即從原來的棧中存放改為靜態存儲區存放。這讓它看起來很像全局變量,其實靜態局部變量與全局變量的主要區別就在於可見性,靜態局部變量只在其被聲明的代碼塊中是可見的。

  對某些必須在調用之間保持局部變量的值的子程序而言,靜態局部變量是特別重要的。如果沒有靜態局部變量,則必須在這類函數中使用全局變量,由此也就打開了引入副作用的大門。使用靜態局部變量最好的示例就是實現統計次數的功能,

  

    靜態局部變量在函數內定義,但不象普通的自動變量那樣,當來調用時就存在,退出函數時就消失。靜態局部變量始終存在着,也就是說它的生存期為整個源程序

    靜態局部變量的生存期雖然為整個源程序,但是其作用域仍與普通的自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數后, 盡管該變量還繼續存在,但不能使用它。

    對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。

    根據靜態局部變量的特點, 可以看出它是一種生存期為整個源文件的量。雖然離開定義它的百函數后不能使用,但如再次調用定義它的函數時,它又可繼續使用, 而且保存了前次被調用后留下的值。 因此,當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮采用靜態局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用(尤其是短名全局變量的變量名污染很嚴重),因此仍以采用局部靜態變量為宜。 

    簡單的說靜態局部變量與全局變量最明顯的區別就在於:全局變量在其定義后所有函數都能用,但是靜度態局部變量只能在一個函數里面用。

 

2、靜態全局變量

  在 C 語言中,static 關鍵字不僅可以用來修飾變量,還可以用來修飾函數。在使用 static 關鍵字修飾變量時,我們稱此變量為靜態變量

  靜態變量的存儲方式與全局變量一樣,都是靜態存儲方式。但這里需要特別說明的是,靜態變量屬於靜態存儲方式,屬於靜態存儲方式的變量卻不一定就是靜態變量。例如,全局變量雖然屬於靜態存儲方式,但並不是靜態變量,它必須由 static 加以定義后才能成為靜態全局變量

    

 

 

3、靜態變量和全局變量的區別

  

  變量一般有兩個屬性,一個是作用域,一個是內存分布空間,靜態變量的內存是分配在全局區(靜態區)的,全局變量與全局靜態變量的區別:

    (1)若程序由一個源文件構成時,全局變量與全局靜態變量沒有區別

    (2)若程序由多個源文件構成時,全局變量與全局靜態變量不同:全局靜態變量使得該變量成為定義該變量的源文件所獨享, 即:全局靜態變量對組成該程序的其它源文件是無效的。

   靜態全局變量的作用:

      (1)不必擔心其它源文件使用相同變量名,彼此相互獨立。

      (2)在某源文件中定義的靜態全局變量不能被其他源文件使用或修改。

 

4、不同之處:

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

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

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

 


免責聲明!

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



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