C語言之static變量及其作用

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/qq_42680327 

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

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

1、隱藏與隔離的作用

上面已經闡述過,全局變量雖然屬於靜態存儲方式,但並不是靜態變量。全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,全局變量在各個源文件中都是有效的。

如果我們希望全局變量僅限於在本源文件中使用,在其他源文件中不能引用,也就是說限制其作用域只在定義該變量的源文件內有效,而在同一源程序的其他源文件中不能使用。這時,就可以通過在全局變量之前加上關鍵字 static 來實現,使全局變量被定義成爲一個靜態全局變量。這樣就可以避免在其他源文件中引起的錯誤。也就起到了對其他源文件進行隱藏與隔離錯誤的作用,有利於模塊化程序設計。

2、保持變量內容的持久性

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

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

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

3、默認初始化爲 0

一、static全局變量與普通的全局變量有什麼區別 ?

  1. 全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。
  2. 全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。
  3. 這兩者的區別在於非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。 
  4. static全局變量只初使化一次,防止在其他文件單元中被引用;   

二、 static局部變量和普通局部變量有什麼區別 ?

  1. 把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作用域,限制了它的使用範圍。  
  2. static局部變量只被初始化一次,下一次依據上一次結果值;   

三、static函數與普通函數有什麼區別?

static函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明爲內部函數(static修飾的函數),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章