C語言中,變量的使用是有一定範圍的,例如函數的形參在函數調用結束就釋放。變量的有效範圍稱為變量的作用域。C語言中所有的變量都有自己的作用域,變量說明的方式不同,其作用域也不同。C語言中的變量根據不同的標準有不同的分類,從作用域範圍(即從空間)角度來看可分為兩種:局部變量和全局變量;從變量值存在的時間(即生存期)角度來看,變量的存儲方式有靜態存儲方式和動態存儲方式兩種,可分為自動變量、寄存器變量、靜態變量、外部變量。
從作用域範圍(即從空間)角度來分可分為局部變量和全局變量。
(1)局部變量
在函數內部定義的變量稱為局部變量(又稱內部變量)。其作用域僅限於本函數內,在該函數外就不能再使用。
例如:
intlocal(inta)/*函數local*/
{
intb,c;/*a、b、c作用於函數local內*/
……
}
voidmain()
{
intm,n;/*m、n作用於函數main內*/
……
}
在函數local內定義了三個變量,a為形參,b、c為一般變量。在local的範圍內a、b、c有效,m、n的作用域限於main函數內。
局部變量的作用域說明如下:
不同於其他語言,在C語言中,main函數定義的變量隻能在main函數中使用。同樣,main函數中也不能使用其他函數中定義的變量。這是由於main函數也是一個函數,它與其他函數是平行關係,應予以注意。
形參是屬於函數內定義的變量,因此也是局部變量,作用域也僅限於本函數。
C語言允許在不同的函數中定義相同的變量名,但它們代表不同的內存單元,不會發生混淆。如在前例中,形參和實參的變量名都為n是完全允許的。
在複合語句中也可定義變量,其作用域隻在複合語句範圍內。
[例811]
voidmain()
{
inti=9,j=3,x;
x=i+j;
{
intx=3;
printf("%d\n",x);
}
printf("%d%d\n",i,x);
}
本程序在main()中定義了i、j、x變量,而在複合語句內又定義了一個變量x,並賦初值為3。注意這兩個x不是同一個變量。在複合語句外定義的x隻在main函數中起作用,而在複合語句內定義的x隻在複合語句內起作用。因此程序第4行的x在main函數中定義,其值應為12。第7行輸出x值,該行在複合語句內,由複合語句內定義的x起作用,其值為3。故輸出值為3,第9行輸出i、x值,由於i是在整個程序中有效的,其值為9,故輸出9。而第9行已在複合語句之外,故輸出的x應為複合語句之外所定義的x,即第3行中定義的變量x,此x值由第4行已獲得為12,故輸出12。
程序運行結果:
3
912
(2)全局變量
在函數外部定義的變量稱為全局變量,它的作用域是從定義全局變量的位置開始到整個程序結束。在一個函數中使用全局變量分兩種情況:一種是全局變量在該函數之前已經定義過,則可以在該函數內直接使用此全局變量;另一種是全局變量在該函數之後定義,則隻有在該函數內對全局變量進行說明之後才能使用。全局變量的說明符為extern。