局部變數和總體變數

文章推薦指數: 80 %
投票人數:10人

這一點表明參數變數只有在函數內才是有效的,離開該函數就不能再使用了。

這種變數有效性的範圍稱變數的作用域。

不僅對於參數變數,C語言中所有的量都有自己的作用域 ... 函數>局部變數和總體變數 局部變數和總體變數 在討論函數的參數變數時曾經提到,參數變數只在被使用期間才分配記憶體單元,使用結束立即釋放。

這一點表明參數變數只有在函數內才是有效的,離開該函數就不能再使用了。

這種變數有效性的範圍稱變數的作用域。

不僅對於參數變數,C語言中所有的量都有自己的作用域。

變數說明的方式不同,其作用域也不同。

C語言中的變數,按作用域範圍可分為兩種,即局部變數和總體變數。

1.1  局部變數    局部變數也稱為內部變數。

局部變數是在函數內作定義說明的。

其作用域僅限於函數內,離開該函數後再使用這種變數是非法的。

例如:    int f1(inta)       /*函數f1*/    {     intb,c;          …… } a,b,c有效    int f2(intx)       /*函數f2*/    {     inty,z; …… } x,y,z有效    main()    { int m,n; ……      } m,n有效 在函數f1內定義了三個變數,a為參數,b,c為一般變數。

在f1的範圍內a,b,c有效,或者說a,b,c變數的作用域限於f1內。

同理,x,y,z的作用域限於f2內。

m,n的作用域限於main函數內。

關於局部變數的作用域還要說明以下幾點: 1)      主函數中定義的變數也只能在主函數中使用,不能在其他函數中使用。

同時,主函數中也不能使用其他函數中定義的變數。

因為主函數也是一個函數,它與其他函數是平行關係。

這一點是與其他語言不同的,應予以注意。

2)      參數變數是屬於被調函數的局部變數,傳入參數變數是屬於主調函數的局部變數。

3)      允許在不同的函數中使用相同的變數名,它們代表不同的物件,分配不同的單元,互不干擾,也不會發生混淆。

如在前例中,參數和傳入參數的變數名都為n,是完全允許的。

4)      在複合語句中也可定義變數,其作用域只在複合語句範圍內。

例如:    main()    {      ints,a;      ……     {      intb;      s=a+b;      ……                /*b作用域*/     }    ……                  /*s,a作用域*/ } 【例8.12】 main() {    int i=2,j=3,k;    k=i+j;    {      int k=8;       printf("%d\n",k);    }     printf("%d\n",k); }   本程式在main中定義了i,j,k三個變數,其中k未賦初值。

而在複合語句內又定義了一個變數k,並賦初值為8。

應該注意這兩個k不是同一個變數。

在複合語句外由main定義的k起作用,而在複合語句內則由在複合語句內定義的k起作用。

因此程式第4行的k為main所定義,其值應為5。

第7行輸出k值,該行在複合語句內,由複合語句內定義的k起作用,其初值為8,故輸出值為8,第9行輸出i,k值。

i是在整個程式中有效的,第7行對i賦值為3,故以輸出也為3。

而第9行已在複合語句之外,輸出的k應為main所定義的k,此k值由第4行已獲得為5,故輸出也為5。

1.2  總體變數 總體變數也稱為外部變數,它是在函數外部定義的變數。

它不屬於哪一個函數,它屬於一個根源程式檔。

其作用域是整個根源程式。

在函數中使用總體變數,一般應作總體變數說明。

只有在函數內經過說明的總體變數才能使用。

總體變數的說明符為extern。

但在一個函數之前定義的總體變數,在該函數內使用可不再加以說明。

例如:    inta,b;         /*外部變數*/    void f1()        /*函數f1*/    {      ……    }    floatx,y;       /*外部變數*/    int fz()         /*函數fz*/    {      ……    }     main()          /*主函數*/    {      ……    } 從上例可以看出a、b、x、y都是在函數外部定義的外部變數,都是總體變數。

但x,y定義在函數f1之後,而在f1內又無對x,y的說明,所以它們在f1內無效。

a,b定義在根源程式最前面,因此在f1,f2及main內不加說明也可使用。

【例8.13】輸入正方體的長寬高l,w,h。

求體積及三個面x*y,x*z,y*z的面積。

ints1,s2,s3; intvs(inta,intb,intc) {    intv;    v=a*b*c;    s1=a*b;    s2=b*c;    s3=a*c;    returnv; } main() {  intv,l,w,h;  printf("\ninputlength,widthand height\n");  scanf("%d%d%d",&l,&w,&h);  v=vs(l,w,h);  printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3); } 【例8.14】外部變數與局部變數同名。

inta=3,b=5;     /*a,b為外部變數*/ max(inta,intb)/*a,b為外部變數*/ { intc;  c=a>b?a:b;  return(c); } main() { inta=8;  printf("%d\n",max(a,b)); }   如果同一個原始檔案中,外部變數與局部變數同名,則在局部變數的作用範圍內,外部變數被“遮罩”,即它不起作用。

   



請為這篇文章評分?