C語言 全局變量
與局部變量對應(yīng)的是全局變量。全局變量是在函數(shù)外部定義的變量,因為是定義在函數(shù)之外,所以也可稱為外部變量。以此類推,在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。
關(guān)于全局變量,做如下幾點說明:
(1)外部變量不屬于任何一個函數(shù),其作用域為從外部變量的定義位置開始,到本文件結(jié)束為止。例如:
int k=0; /*定義全局變量k*/
void fun(int m) /*m為形參,局部變量*/
{
m=m+k;
k+=m;
printf("m=%d k=%d".m,k);
}
main() /*i為main()函數(shù)的局部變量 */
{
int i=4;
fun(i++);
printf (" i=%d k=%d\n",i,k);
}
程序分析:
從main()函數(shù)執(zhí)行,首先定義變量i,初值為4,調(diào)用fun(i++)函數(shù),將i的值4作為實參傳遞,之后i的值加1。
fun()函數(shù)中,形參m接收實參傳遞的值4,執(zhí)行m=m+k, k是全局變置,取出k值0,參與m+k運算,所以m的值為4+0,
計算k=k+m運算,k的值也為4, printf()函數(shù)的執(zhí)行結(jié)果為:m=4, k=4。fun()函數(shù)執(zhí)行結(jié)束, 返回main()函數(shù)調(diào)用處繼續(xù)執(zhí)行。
main()函數(shù)開始執(zhí)行printf()函數(shù),輸出結(jié)果為:i=5, k=4。
通過分析可以看出,變量k是全局變量,當(dāng)k的值在fun()函數(shù)中被改變時,這種改變將作用在所有后面使用變量k的函數(shù)中。
(2)全局變量可以和局部變量同名。同名時,在局部變量的作用域內(nèi),局部變量屏蔽全局變量,
例如:
#include<stdio.h〉
int a=5;
void fun(int b)
{
int a=10;
a+=b;
printf("%d ",a);
}
main()
{
int k=20;
fun(k);
a+=*k;
printf("%d \n",a);
程序分析:
main()函數(shù)中變置k為局部變量,只在main()函數(shù)內(nèi)有效,調(diào)用fun()函數(shù)將變置k的值20作為實參傳遞給fun()函數(shù)的形參b。
在fun()函數(shù)內(nèi)部定義了_個變量a,這個a是局部變量,與在函數(shù)外部定義的全局變量a不是一回事。在函數(shù)內(nèi)部,如果局部變量與全局變量重名,局部變量屏蔽全局變量,所以程序的執(zhí)行過程為:
a=a+b,相當(dāng)于a=10+20,即a的值為30,輸出。
fun()函數(shù)執(zhí)行完畢,返回main()函數(shù)調(diào)用處繼續(xù)執(zhí)行a+=k;。因為在main()函數(shù)內(nèi)部沒有定義變量a,所以此處出現(xiàn)的是全局變量a,經(jīng)過賦值計算,全局變置a的值為25,輸出。
(3)外部變量的作用域是從定義處到本文件結(jié)束。如圖所示,程序中出現(xiàn)三組全局變量,每組全局變量的定義位置都不一樣。x、y定義在所有函數(shù)的最上面,所以它們的作用范圍為整個文件;全局變量m、n定義在fun()和main()函數(shù)之間,如果不做聲明,那么只有main()函數(shù)可以使用它們,fun()函數(shù)如果使用會出現(xiàn)“變量未定義”的錯誤。同樣,全局變量a、b定義在文件的末尾,所有函數(shù)的后面,如果main()函數(shù)和fun()函數(shù)試圖使用a、b,也會出現(xiàn)“變量未定義”的錯誤。
C語言規(guī)定,如果定義點之前的函數(shù)引用這些全局變量時,需要在函數(shù)內(nèi)對被引用的外部變量進行說明。全局變量說明的一般形式為:
extern數(shù)據(jù)類型外部變置[,外部變量2……];
例如,在main()函數(shù)中想使用全局變量a, b的說明語句為:
extern float a,b;
點擊加載更多評論>>