C語言中static的作用

C程序一直由下列部分組成:

  1)正文段——CPU執行的機器指令部分;一個程序只有一個副本;只讀,防止程序由於意外事故而修改自身指令;   

  2)初始化數據段(數據段)——在程序中所有賦了初值的全局變量,存放在這裏。   

  3)非初始化數據段(bss段)——在程序中沒有初始化的全局變量;內核將此段初始化爲0    

  4)棧——增長方向:自頂向下增長;自動變量以及每次函數調用時所需要保存的信息(返回地址;環境信息)。     

  5)堆——動態存儲分。

1.全局靜態變量

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

1)內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)

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

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

好處:

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

1)不會被其他文件所訪問,修改

2)其他文件中可以使用相同名字的變量,不會發生衝突。

.2.局部靜態變量

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

  1)內存中的位置:靜態存儲區

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

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

 

 注:當static用來修飾局部變量的時候,它就改變了局部變量的存儲位置,從原來的棧中存放改爲靜態存儲區。但是局部靜態變量在離開作用域之後,並沒有被銷燬,而是仍然駐留在內存當中,直到程序結束,只不過我們不能再對他進行訪問。

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

3. 靜態函數

在函數的返回類型前加上關鍵字static,函數就被定義成爲靜態函數。

 函數的定義和聲明默認情況下是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用。

定義靜態函數的好處:

1)其他文件中可以定義相同名字的函數,不會發生衝突

2)靜態函數不能被其他文件所用。存儲說明符autoregisterexternstatic,對應兩種存儲期:自動存儲期和靜態存儲期。 autoregister對應自動存儲期。具有自動存儲期的變量在進入聲明該變量的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。

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

.4.由於static變量的以上特性,可實現一些特定功能。

1)統計次數功能

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

5.不同類型變量的區別

auto類型(普通)局部變量相比, static局部變量有三點不同

1)存儲空間分配不同

auto類型分配在棧上, 屬於動態存儲類別, 佔動態存儲區空間, 函數調用結束後自動釋放, static分配在靜態存儲區, 在程序整個運行期間都不釋放. 兩者之間的作用域相同, 但生存期不同.

2static局部變量在所處模塊在初次運行時進行初始化工作, 且只操作一次

3)對於局部靜態變量, 如果不賦初值, 編譯期會自動賦初值0或空字符, auto類型的初值是不確定的. (對於C++中的class對象例外, class的對象實例如果不初始化, 則會自動調用默認構造函數, 不管是否是static類型)

特點: static局部變量的”記憶性”與生存期的”全局性”

所謂”記憶性”是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.

.6.外部靜態變量/函數

C static有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。但爲了限制全局變量/函數的作用域, 函數或變量前加static使得函數成爲靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅侷限於本文件(所以又稱內部函數)注意此時, 對於外部(全局)變量, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起作用域限制作用, 限定作用域在本模塊(文件)內部.

使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章