變量的作用範圍與存儲類型

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)利用全局變量可以減少函數實參與形參的個數。可以減少變量的個數,減少由於實際參數和形式參數的數據傳遞帶來的時間消耗。

全局變量的缺點

(1)局變量保存在靜態存貯區,程序開始運行時爲其分配內存,程序結束釋放該內存。與局部變量的動態分配、動態釋放相比,生存期比較長,因此過多的全局變量會佔用較多的內存單元。
(2)全局變量破壞了函數的封裝性能。前面的章節曾經講過,函數象一個黑匣子,一般是通過函數參數和返回值進行輸入輸出,函數內部實現相對獨立。但函數中 如果使用了全局變量,那麼函數體內的語句就可以繞過函數參數和返回值進行存取,這種情況破壞了函數的獨立性,使函數對全局變量產生依賴。同時,也降低了該 函數的可移植性。

(3)全局變量使函數的代碼可讀性降低。由於多個函數都可能使用全局變量,函數執行時全局變量的值可能隨時發生變化,對於程序的查錯和調試都非常不利。因此,如果不是萬不得已,最好不要使用全局變量。



定義:

 C語言中的變量不僅有類型屬性,而且還有存儲類別的屬性。完整的變量定義應該確定它的兩種屬性:存儲類型和數據類型。
 變量定義的完整形式爲:
[存儲類型]類型說明符變量名錶列;

變量佔用內存單元的時間稱爲“生存期”,變量的生存期是由變量的存儲位置決定的

 CPU寄存器:CPU寄存器中存儲的數據是動態存儲類型,不能長期佔用。
內存儲器:內存中供用戶使用的存儲空間分爲代碼區與數據區兩個部分。
靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。
動態存儲方式:是在程序運行期間根據需要進行動態的分配存儲空間的方式。
比如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. 
寄存器變量:用關鍵字register說明的變量是寄存器類型變量。C++編譯器江永寄存器類型變量的值存放在CPU的寄存器中,而不是存儲器中,從而提高程序運行效率,常用語循環控制。
#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中寄存器的個數是有限的,因此使用寄存器變量的個數也是有限的 
定義成寄存器類型的變量未必能按寄存器變量使用,還是當着一般變量來使用,這個取決於編譯器 
靜態變量:靜態變量的類型說明符是static,屬於靜態存儲方式。
特點:具有缺省的初值0,有全局和局部之分。當static修飾的是局部變量的時候,說明該變量一直存在,但是該變量只能在該作用域內使用(靜態變量的記憶功能)。
當static修飾的是全局變量的時候,表示該全局變量只能在本文件(源程序)中使用,其他文件是不允許引用被static修飾的全局變量的。一般的全局變量雖然不是靜態變量,但像靜態變量一樣具有缺省的初值爲0.靜態數組變量同樣具有缺省的初值爲0,如static int a[10];則數組a的每個元素的值都爲0.
靜態局部變量和非局部變量的本質區別是存儲類不同:靜態局部變量分配在數據段/bss段上,而非靜態局部變量分配在棧上。

注意:

1.局部變量默認auto型 
2.register型變量個數受限,且不能爲long,double,float型。 
3.局部static變量具有全局壽命和局部可見性,還具有可繼承型。 
4.extern不是變量定義,可擴展外部變量作用域。 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章