靜態(tài)變量
靜態(tài)變量的類型說明符是static。靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是
靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部
變量,或稱靜態(tài)全局變量。 對于自動(dòng)變量,前面已經(jīng)介紹它屬于動(dòng)態(tài)存儲方式。 但是也可以用 static定義它為靜態(tài)
自動(dòng)變量,或稱靜態(tài)局部變量,從而成為靜態(tài)存儲方式。
由此看來, 一個(gè)變量可由 static進(jìn)行再說明,并改變其原有的存儲方式。
靜態(tài)局部變量
在局部變量的說明前再加上 static說明符就構(gòu)成靜態(tài)局部變量。
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
靜態(tài)局部變量屬于靜態(tài)存儲方式,它具有以下特點(diǎn):
(1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動(dòng)變量那樣,當(dāng)調(diào)用時(shí)就存在,退出函數(shù)時(shí)就消失。靜態(tài)局部變量始終存在
著,也就是說它的生存期為整個(gè)源程序。
(2)靜態(tài)局部變量的生存期雖然為整個(gè)源程序,但是其作用域仍與自動(dòng)變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該
變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。
(3)允許對構(gòu)造類靜態(tài)局部量賦初值。在數(shù)組一章中,介紹數(shù)組初始化時(shí)已作過說明。若未賦以初值,則由系統(tǒng)自動(dòng)賦
以0值。
(4)對基本類型的靜態(tài)局部變量若在說明時(shí)未賦以初值,則系統(tǒng)自動(dòng)賦予 0值。而對自動(dòng)變量不賦初值,則其值是不定
的。 根據(jù)靜態(tài)局部變量的特點(diǎn), 可以看出它是一種生存期為整個(gè)源程序的量。雖然離開定義它的函數(shù)后不能使用,
但如再次調(diào)用定義它的函數(shù)時(shí),它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個(gè)函數(shù)
且要求在調(diào)用之間保留某些變量的值時(shí),可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達(dá)到上述目的,但全局變
量有時(shí)會造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜。
[例5.15]main()
{
int i;
void f(); /*函數(shù)說明*/
for(i=1;i<=5;i++)
f(); /*函數(shù)調(diào)用*/
}
void f() /*函數(shù)定義*/
{
auto int j=0;
++j;
printf("%d\n",j);
}
程序中定義了函數(shù)f,其中的變量j 說明為自動(dòng)變量并賦予初始值為0。當(dāng)main中多次調(diào)用f時(shí),j均賦初值為
0,故每次輸出值均為 1。現(xiàn)在把 j改為靜態(tài)局部變量,程序如下:
main()
{
int i;
void f();
for (i=1;i<=5;i++)
f();
}
void f()
{
static int j=0;
++j;
printf("%d\n",j);
}
void f()
{
static int j=0;
++j;
printf("%d/n",j);
}
由于 j為靜態(tài)變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時(shí)繼續(xù)使用,所以輸出值成為累加的結(jié)果。讀者可自行
分析其執(zhí)行過程。
![]() | ![]() .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書籍 |
![]() | ![]() .. 定價(jià):¥133 優(yōu)惠價(jià):¥133.0 更多書籍 |