變量的作用範圍
C語言按變量的作用範圍可以將變量可分爲局部變量和全局變量。
局部變量
定義:不管是主函數還是其他函數,在函數內聲明的變量(包括函數參數)統稱爲局部變量。 | |
特點:是隨函數的調用而生成,函數的調用結束而釋放。 | |
作用:作用範圍是定義它的函數,只在定義它的作用域內有效,當退出作用域時,其儲存空間被釋放。而且所有定義過的變量都是局部變量。 |
例如:
int fl(int a)
{
int b,c;
...
} /*a,b,c作用域:僅限於函數fl()中*/
int f2(int x)
{
int y,z;
...
} /*x,y,z作用域:僅限於函數f2()中*/
main()
{
int m,n;
...
} /*m,n作用域:僅限於函數main()中*/
局部變量的作用域的說明:(1)形參變量也是局部變量,屬於被調函數;實參變量,則是調用函數的局部變量。 | |
(2)在複合語句中也可以定義局部變量,其作用域只在複合語句範圍內。 | |
(3)主函數main()中定義的局部變量,也只能在主函數中使用,其他函數不能使用。同時,主函數也不能使用其他函數中定義的局部函數。因爲主函數也是一個函數,與其他函數是平行關係。這一點是與其他語言不同的,應予以注意。 |
全局變量
定義:函數外定義的變量稱爲全局變量。全局變量可以被定義它的文件中的所有函數使用。 | |
作用:其作用域是整個源程序。在函數中使用全局變量,一般應作全局變量說明。 | |
特點:全局可視,任何一個函數都可以訪問和更改變量值。.內存地址固定,讀寫效率高。 |
注意:如果定義了與全局變量同名的局部變量,則局部變量優先。
#include<stdio.h>
int s1,s2,s3;
int vs(int a,int b,int c)
{
int v;
v=a*b*c;s1=a*b;s2=b*c;s3=a*c;
return v;
}
main()
{
int v,1,w,h;
printf("\ninput length,width and height:");
v=vs(1,w,h);
printf("v=%d s1=%d s2=%d s3=%d\n",v,s1,s2,s3);
}
結果輸出:
input length,width and height:10,6,5
v=300 s1=60 s2=30 s3=50
程序說明:
1,第2行定義整型全局變量是,s1,s2和s3;
2 , 第3~8行定義函數vs,計算長方體的體積和三個面的面積。
3,第11~13行定義局部整行變量v,1,w,和h並通過鍵盤輸入進行初始化。
4,第14行調用函數vs,計算長方體的體積和三個面的面積,函數的參數遵循“單向值傳遞”的法則,所以局部變量v,1,w和h只能將值傳遞給vs形參,而形參卻不能改變實參的值,但在函數vs中將計算結果賦值給三個全局變量s1,s2和s3,全局變量在整個程序中都是可見並有效的,程序中任何一個地方對全局變量的操作都可以改變其值。
全局變量的說明:
1.全局變量可加強函數模塊之間的數據聯繫,但是又使這些函數依賴這些全局變量,因而使得這些函數的獨立性降低。 | |
從模塊化 程序設計的觀點來看這是不利的,因此不是非用不可時,不要使用全局變量。 | |
1.全局變量的作用域是從定義點道文件結束。如果定義點之前的函數需要引用這些全局變量,需要在函數內對被引用的全局變量進行說明。全局變量說明的一般形式爲: extern數據類型 全局變量[.全局變量 2......]; 外部變量使用關鍵字“extern”定義,在函數體之外定義。存放在靜態儲存區。 |
全局變量的優點:
(1)增加了各函數間數據傳送的渠道。特別是函數返回值通常僅限於一個,在很多場合不能滿足使用要求。此時利用全局變量,可以得到更多的數據處理結果。
(2)利用全局變量可以減少函數實參與形參的個數。可以減少變量的個數,減少由於實際參數和形式參數的數據傳遞帶來的時間消耗。
全局變量的缺點:
(3)全局變量使函數的代碼可讀性降低。由於多個函數都可能使用全局變量,函數執行時全局變量的值可能隨時發生變化,對於程序的查錯和調試都非常不利。因此,如果不是萬不得已,最好不要使用全局變量。
變量的存儲類別
[存儲類型]類型說明符變量名錶列;
變量佔用內存單元的時間稱爲“生存期”,變量的生存期是由變量的存儲位置決定的
內存儲器:內存中供用戶使用的存儲空間分爲代碼區與數據區兩個部分。
動態存儲方式:是在程序運行期間根據需要進行動態的分配存儲空間的方式。
比如extern u8 tpwakeupswitch;extern int tpwakeupswitch_read();一定要加上返回類型,親身碰到沒有返回類型,引用過來的變量是很奇怪的值。
四)register:register稱爲寄存器變量。它只能用於整型和字符型變量。定義符register說明的變量被存儲在CPU的寄存器中,定義一個整型寄存器變量可寫成: register int a;
對於以上四種數據的存儲位置:register變量存在CPU的寄存器中;auto類型變量存在內存的棧;static型的局部變量和全局變量以及extern型變量(即全局變量),存在於內存的靜態區。
1,自動存儲類型
定義:
自動變量又稱動態變量,在程序執行過程中,需要使用它時才分配存儲單元,使用完立即釋放。
關鍵字auto表示變量是自動存儲類型,自動存儲類型的變量具有動態性。存儲在堆區和棧區的變量,隨函數調用而生成,隨函數調用結束而釋放,C語言從存儲的角度稱這些變量爲自動變量。
動態變量的定義格式:
auto 數據類型 變量名;/* 關鍵字 auto 可缺省*/
例如,定義a,b,c爲整型自動存儲類別變量:
auto int a,b,c
外部變量:說明外部變量的關鍵字爲extern,外部變量有兩種情形:1.本文件(源程序)中的全局變量先使用後說明的,使用前要說明爲外部變量。
2.其他文件中未用static說明的全局變量。
特點:
外部變量一定是全局變量。 | |
外部變量的存儲類型是靜態類型,具有缺省初值0. |
#include<stdio.h>
main()
{
int a=0;
register int i;
for(i=1;i<10;i++)
{
a+=i;
printf("%d",a);
}
printf("\n");
}
運行結果:
a.out
1 3 6 10 15 21 28 36 45
注意:由於寄存器變量屬於動態存儲方式,故只有局部自動變量和形式參數纔可以定義爲寄存器變量。 | |
凡需要採用靜態存儲方式的量不能定義爲寄存器變量。 | |
由於CPU中寄存器的個數是有限的,因此使用寄存器變量的個數也是有限的。 | |
定義成寄存器類型的變量未必能按寄存器變量使用,還是當着一般變量來使用,這個取決於編譯器。 |
特點:具有缺省的初值0,有全局和局部之分。當static修飾的是局部變量的時候,說明該變量一直存在,但是該變量只能在該作用域內使用(靜態變量的記憶功能)。
當static修飾的是全局變量的時候,表示該全局變量只能在本文件(源程序)中使用,其他文件是不允許引用被static修飾的全局變量的。一般的全局變量雖然不是靜態變量,但像靜態變量一樣具有缺省的初值爲0.靜態數組變量同樣具有缺省的初值爲0,如static int a[10];則數組a的每個元素的值都爲0.
靜態局部變量和非局部變量的本質區別是存儲類不同:靜態局部變量分配在數據段/bss段上,而非靜態局部變量分配在棧上。
注意:
1.局部變量默認auto型 | |
2.register型變量個數受限,且不能爲long,double,float型。 | |
3.局部static變量具有全局壽命和局部可見性,還具有可繼承型。 | |
4.extern不是變量定義,可擴展外部變量作用域。 |