二級C語言考試輔導(dǎo)教程第五章:函數(shù)[9]

字號:

二、外部變量外部變量的類型說明符為extern。
     在前面介紹全局變量時已介紹過外部變量。這里再補(bǔ)充說明外部變量的幾個特點:
     1. 外部變量和全局變量是對同一類變量的兩種不同角度的提法。全局變是是從它的作用域提出的,外部變量從它的存儲方式提出的,表示了它的生存期。
     2. 當(dāng)一個源程序由若干個源文件組成時, 在一個源文件中定義的外部變量在其它的源文件中也有效。例如有一個源程序由源文件F1.C和F2.C組成: F1.C
     int a,b; /*外部變量定義*/
     char c; /*外部變量定義*/
     main()
     {
     ……
     }
     F2.C
     extern int a,b; /*外部變量說明*/
     extern char c; /*外部變量說明*/
     func (int x,y)
     {
     ……
     }
     在F1.C和F2.C兩個文件中都要使用a,b,c三個變量。在F1.C文件中把a(bǔ),b,c都定義為外部變量。在F2.C文件中用extern把三個變量說明為外部變量,表示這些變量已在其它文件中定義,并把這些變量的類型和變量名,編譯系統(tǒng)不再為它們分配內(nèi)存空間。 對構(gòu)造類型的外部變量, 如數(shù)組等可以在說明時作初始化賦值,若不賦初值,則系統(tǒng)自動定義它們的初值為0。
     三、靜態(tài)變量
     靜態(tài)變量的類型說明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量。 對于自動變量,前面已經(jīng)介紹它屬于動態(tài)存儲方式。 但是也可以用static定義它為靜態(tài)自動變量,或稱靜態(tài)局部變量,從而成為靜態(tài)存儲方式。 來源:www.examda.com
     由此看來, 一個變量可由static進(jìn)行再說明,并改變其原有的存儲方式。
     1. 靜態(tài)局部變量
     在局部變量的說明前再加上static說明符就構(gòu)成靜態(tài)局部變量。
     例如:
     static int a,b;
     static float array[5]={1,2,3,4,5};
     靜態(tài)局部變量屬于靜態(tài)存儲方式,它具有以下特點:
     (1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動變量那樣,當(dāng)調(diào)用時就存在,退出函數(shù)時就消失。靜態(tài)局部變量始終存在著,也就是說它的生存期為整個源程序。
     (2)靜態(tài)局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。
     (3)允許對構(gòu)造類靜態(tài)局部量賦初值。在數(shù)組一章中,介紹數(shù)組初始化時已作過說明。若未賦以初值,則由系統(tǒng)自動賦以0值。
     (4)對基本類型的靜態(tài)局部變量若在說明時未賦以初值,則系統(tǒng)自動賦予0值。而對自動變量不賦初值,則其值是不定的。 根據(jù)靜態(tài)局部變量的特點, 可以看出它是一種生存期為整個源程序的量。雖然離開定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時,它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個函數(shù)且要求在調(diào)用之間保留某些變量的值時,可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達(dá)到上述目的,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態(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);
     }