static在C語言中主要是兩種用法c++
一、修飾局部變量函數
二、修飾函數和全局變量spa
局部變量按照存儲形式來分,分爲auto,static,registercode
首先從內存四區的角度去看,auto即爲普通的局部變量,存儲在棧上,當函數結束時,隨之釋放。生命週期
register爲寄存器變量,存放在寄存器裏面,調用速度快。內存
在C語言中register變量不能取地址,會報錯。作用域
而在c++中,對register作了加強,黨C++編譯器發現程序中須要取register變量的地址時,register對變量的聲明變得無效。編譯器
static修飾局部變量時該變量是存放在靜態存儲區,生命週期是整個程序結束。編譯
static局部變量初次定義時就要初始化,且只能初始化一次。若是在定義的時候不初始化,編譯器就會自動賦值爲0;(也就是說若是重複調用同一個函數,在第二次調用時,就不會再執行static局部變量初始化那句話 了)class
特色: static局部變量的」記憶性」與生存期的」全局性」
所謂」記憶性」是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
void staticLocalVar()
{
static int a = 0; // 運行期時初始化一次, 下次再調用時, 不進行初始化工做
printf(「%d」,a);
a++;
}
int main()
{
staticLocalVar(); // 第一次調用, 輸出a=0
staticLocalVar(); // 第二次調用, 記憶了第一次退出時的值, 輸出a=1
return 0;
}
注意事項:
1. 「記憶性」, 程序運行很重要的一點就是可重複性, 而static變量的」記憶性」破壞了這種可重複性, 形成不一樣時刻至運行的結果可能不一樣.
2. 「生存期」全局性和惟一性. 普通的local變量的存儲空間分配在stack上, 所以每次調用函數時, 分配的空間均可能不同, 而static具備全局惟一性的特色, 每次調用時, 都指向同一塊內存, 這就形成一個很重要的問題 ---- 不可重入性
2、
當static修飾全局變量或者函數時,不是爲了限制其存儲方式,而主要是爲了限制該全局變量或者函數的做用域僅限於本文件,因此又稱爲內部函數。此件時, 對於外部(全局)變量, 不管是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起做用域限制做用, 限定做用域在本模塊(文)內部.
使用內部函數的好處是:不一樣的人編寫不一樣的函數時,不用擔憂本身定義的函數,是否會與其它文件中的函數同名。