天天看點

static 詳解

在 全局變量 之前加上關鍵字static,全局變量就被定義成為一個全局靜态變量。

   1)記憶體中的位置:靜态存儲區(靜态存儲區在整個程式運作期間都存在)

   2)初始化:未經初始化的全局靜态變量會被程式自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)

   3)作用域:全局靜态變量在聲明他的檔案之外是不可見的。準确地講從定義之處開始到檔案結尾。

好處:

定義全局靜态變量的好處:

<1>不會被其他檔案所通路,修改

<2>其他檔案中可以使用相同名字的變量,不會發生沖突。

1.局部靜态變量

在局部變量之前加上關鍵字static,局部變量就被定義成為一個局部靜态變量。

  1)記憶體中的位置:靜态存儲區

  2)初始化:未經初始化的全局靜态變量會被程式自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)

  3)作用域:作用域仍為局部作用域,當定義它的函數或者語句塊結束的時候,作用域随之結束。

 注:當static用來修飾局部變量的時候,它就改變了局部變量的存儲位置,從原來的棧中存放改為靜态存儲區。但是局部靜态變量在離開作用域之後,并沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,隻不過我們不能再對他進行通路。

當static用來修飾全局變量的時候,它就改變了全局變量的作用域(在聲明他的檔案之外是不可見的),但是沒有改變它的存放位置,還是在靜态存儲區中。

2.靜态函數

在函數的傳回類型前加上關鍵字static,函數就被定義成為靜态函數。

函數的定義和聲明預設情況下是extern的,但靜态函數隻是在聲明他的檔案當中可見,不能被其他檔案所用。

定義靜态函數的好處:

<1> 其他檔案中可以定義相同名字的函數,不會發生沖突

<2> 靜态函數不能被其他檔案所用。 存儲說明符auto,register,extern,static,對應兩種存儲期:自動存儲期和靜态存儲期。 auto和register對應自動存儲期。具有自動存儲期的變量在進入聲明該變量的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。

關鍵字extern和static用來說明具有靜态存儲期的變量和函數。用static聲明的局部變量具有靜态存儲持續期(static storage duration),或靜态範圍(static extent)。雖然他的值在函數調用之間保持有效,但是其名字的可視性仍限制在其局部域内。靜态局部對象在程式執行到該對象的聲明處時被首次初始化。

由于static變量的以上特性,可實作一些特定功能。

1. 統計次數功能

聲明函數的一個局部變量,并設為static類型,作為一個計數器,這樣函數每次被調用的時候就可以進行計數。這是統計函數被調用次數的最好的辦法,因為這個變量是和函數息息相關的,而函數可能在多個不同的地方被調用,是以從調用者的角度來統計比較困難。

 C語言中使用靜态函數的好處:

      靜态函數會被自動配置設定在一個一直使用的存儲區,直到退出應用程式執行個體,避免了調用函數時壓棧出棧,速度快很多。 

      關鍵字“static”,譯成中文就是“靜态的”,是以内部函數又稱靜态函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本檔案。 使用内部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它檔案中的函數同名,因為同名也沒有關系。 

c語言中static的語義

1.static變量:

1).局部a.靜态局部變量在函數内定義,生存期為整個源程式,但作用域與自動變量相同,隻能在定義該變量的函數内使用。退出該函數後, 盡管該變量還繼續存在,但不能使用它。b.對基本類型的靜态局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。

2).全局全局變量本身就是靜态存儲方式, 靜态全局變量當然也是靜态存儲方式。但是他們的作用域,非靜态全局 變量的作用域是整個源程式(多個源檔案可以共同使用); 而靜态全局變量則限制了其作用域, 即隻在定義該變量的源檔案内有效, 在同一源程式的其它源檔案中不能使用它。

2.static函數(也叫内部函數):

隻能被本檔案中的函數調用,而不能被同一程式其它檔案中的函數調用。差別于一般的非靜态函數(外部函數)     static在c裡面可以用來修飾變量,也可以用來修飾函數。         先看用來修飾變量的時候。變量在c裡面可分為存在全局資料區、棧和堆裡。其實我們平時所說的堆棧是棧而不包含堆。