## 【我解C語言面試題系列】001 static有什么用途?
【題目】static有什么用途?
在網上流傳很廣的一個答案是:
1、限制變量的作用域
2、設置變量的存儲域
?? 我覺得這樣答題是不妥當的,有點文不對題的感覺。
下面是我給出的答案:
static類型聲明符在C語言里面主要有三個用途:
1、聲明靜態局部變量。
2、聲明靜態外部全局變量。
3、聲明靜態外部函數。
下面是我整理的有關上面三個用法的解釋說明。另外網友xiaocai0001的《static用法小結》一文有更詳細的解釋,請參考。
[http://blog.csdn.net/xiaocai0001/archive/2006/04/14/662921.aspx](http://blog.csdn.net/xiaocai0001/archive/2006/04/14/662921.aspx)
**靜態局部變量**(與auto對比)
**1、存儲空間分配、作用域和生存期**
static分配在靜態存儲區,作用域僅僅限于聲明該變量的函數內部。在程序
整個運行期間都不釋放,生存期貫穿于程序運行的整個過程。
auto類型分配在棧上,屬于動態存儲類別,占動態存儲區空間,作用域僅僅限于聲明該變量的函數內部。函數調用結束后自動釋放,生存期不過是在聲明該變量的函數內部。
**2、賦初值時的處理方式**
static靜態局部變量在編譯時賦初值,即只賦初值一次;
auto自動變量賦初值是在函數調用時進行,每調用一次函數重新給一次初值,相當于執行一次賦值語句。
**3、未賦初值時的處理方式**
如果在定義局部變量時不賦初值的話:
static靜態局部變量,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。
auto自動變量,如果不賦初值則它的值是一個不確定的值。
**靜態外部全局變量**
在C語言中static還用來聲明靜態外部全局變量,那么這個全局變量的作用域就被限制在本文件內部。
外部變量(即全局變量)是在函數的外部定義的,它的作用域為從變量定義處開始,到本程序文件的末尾。如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件終了。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”。表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。
而如果我們聲明的全局變量不想被其他文件訪問和使用又該怎么辦?
那就是在聲明的時候前面加上關鍵字static。
**靜態外部函數**
在C語言中我們的函數默認都是全局的,也就是說你可以調用其他文件中的函數。在使用的時候,我們象前面一樣在頭文件中加上extern就可以了。但是有時候我們寫的函數并不想讓別的文件訪問和調用,那么我們在聲明函數的時候前面加上static就可以了。
使用內部函數的好處有二:
1、可以讓某些內部函數不為人所能使用,而僅僅讓調用者使用他能使用的東西,有利于保護代碼。
2、不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。