static聲明,可以用于聲明外部變量,內(nèi)部變量,函數(shù)。
- 這里只討論它作用于變量的情況;
- 參考資料:《C程序設(shè)計語言》 4.6:靜態(tài)變量;
- 此處只是梳理一下自己的理解,不一定正確,最好還是自己看書并
動手實踐。
static 用于聲明外部變量:
- 變量的作用域縮小
- 可用于隱藏外部變量
作用域
外部變量使用static聲明后,作用域限定為當(dāng)前源文件,聲明了這個變量之后的部分。

圖1
如圖1所示,在這個文件里,static聲明的作用域為下方的B區(qū)域。
做些實踐來驗證一下:
int main() {
b = 1; //報錯:使用未聲明變量b。
return 0;
}
static int b =10;
在第二行顯示錯誤:使用未聲明變量b 。
#include <stdio.h>
void test1();//在main函數(shù)之前聲明test函數(shù),不然main函數(shù)沒法調(diào)用。
int main() {
test1();
return 0;
}
static int b =10;
//test函數(shù)的實現(xiàn)
void test1(){
printf("%d\n",b);//可以使用變量b,因為處于變量b的作用域。
}
如果把最下面那段test1函數(shù)實現(xiàn)的代碼移到static聲明的上方,就會出現(xiàn)錯誤:使用未聲明變量b。
隱藏外部變量
static對于外部變量的作用在于,能夠把自己隱藏起來。
有兩個函數(shù),需要同時使用一個變量,使用外部變量是一個辦法,這樣,兩個函數(shù)都可以訪問這一個變量了。但是如果只希望這兩個函數(shù)使用,而其他函數(shù)不能夠直接訪問這個變量的話,就需要使用static聲明,把這個變量隱藏起來。
static int a;
void push(){
......
}
void pop(){
......
}
比如說,上面這個變量和兩個函數(shù)寫在一個文件里。那么其他函數(shù)就不能訪問變量a了。
static 用于聲明內(nèi)部變量:
- 作用域不變
- 變量不隨函數(shù)調(diào)用和退出而存在和消失
對于作用范圍,變量前加不加static聲明,并不會產(chǎn)生影響。聲明與否,都只能在聲明該變量的函數(shù)里面使用。
聲明static的區(qū)別在于:不論這個函數(shù)是否被調(diào)用,其內(nèi)部聲明的靜態(tài)變量一直存在,而不像沒有聲明static的變量:隨著函數(shù)的調(diào)用和退出而存在和消失(即每次函數(shù)調(diào)用,初始化一次變量。)
void test(){
staic int c =1;
printf("%d\n",c); c++;
}
int main(int argc, const char * argv[]) {
test();
test();
test();
return 0;
}
輸出結(jié)果為:
1
2
3
如果去掉static聲明,結(jié)果為:
1
1
1
總結(jié)
什么時候要使用static聲明?
-
對于外部變量:
- 為了函數(shù)之間共用一個變量--交流數(shù)據(jù);
- 但只希望有限的幾個函數(shù)能夠使用這個變量,而不是全部。
-
對于內(nèi)部變量:
- 不需要與其他函數(shù)共用變量;
- 但需要一個持久的變量來記錄一些數(shù)據(jù)。