變量可以在程序中三個地方說明:?函數(shù)內(nèi)部、函數(shù)的參數(shù)定義中或所有的函數(shù)外部老玛。根據(jù)所定義位置的不同,?變量可分為局部變量、形式參數(shù)和全程變量苟蹈。從空間角度來看,變量可以分為全局變量和局部變量右核,而從時間角度來分的?可以有靜態(tài)存儲變量和動態(tài)存儲變量之分慧脱。
從作用域看:
1>:全局變量具有全局作用域。全局變量只需在一個源文件中定義贺喝,就可以作用于所有的源文件磷瘤。當然,其他不包含全局變量定義的源文件需要用extern 關鍵字再次聲明這個全局變量搜变。
2>:靜態(tài)局部變量具有局部作用域采缚,它只被初始化一次,自從第一次被初始化直到程序運行結(jié)束都一直存在挠他,它和全局變量的區(qū)別在于全局變量對所有的函數(shù)都是可見的扳抽,而靜態(tài)局部變量只對定義自己的函數(shù)體始終可見。
3>:局部變量也只有局部作用域殖侵,它是自動對象(auto)贸呢,它在程序運行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在拢军,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后楞陷,變量被撤銷,其所占用的內(nèi)存也被收回茉唉。
4>:靜態(tài)全局變量也具有全局作用域固蛾,它與全局變量的區(qū)別在于如果程序包含多個文件的話结执,它作用于定義它的文件里,不能作用到其它文件里艾凯,即被static關鍵字修飾過的變量具有文件作用域献幔。這樣即使兩個不同的源文件都定義了相同名字的靜態(tài)全局變量,它們也是不同的變量趾诗。
?全局變量和局部變量
1蜡感。局部變量
他是?指在函數(shù)內(nèi)部定義的變量?作用域為定義局部變量的函數(shù)?也就是說他只能在定義他的函數(shù)中使用
最值得注意的是?只有在程序執(zhí)行到定義他的模塊時才能生成,一旦執(zhí)行退出該模塊則起變量消失
對于全局變量?如果在定義的時候不做初始化?則系統(tǒng)將自動為起賦值?數(shù)值型為0
字符型為空'/0'
全局變量的弊端?增加內(nèi)存開銷?降低函數(shù)的通用性
定義全局變量時?理想的位置是在文件的開頭?當這些函數(shù)以及同一個程序中的其他源程序文件中的某些函數(shù)需要使用該全局變量時?在函數(shù)內(nèi)部對該變量使用extern?加以說明?說明他是外部的?
對外部變量的說明?只是聲明該變量是在外部定義過的一個全局變量?在這里引用?而對全局變量的定義則是要對起分配存儲單元的
一個全局變量只能定義一次?可是卻可以多次引用
***?在同一源文件中恃泪,全局變量和局部變量同名時郑兴,在局部變量的作用域內(nèi),全局變量不起作用的贝乎。
例如: int ? i=5;
?int ?main()
?{?
? ? printf( "%d\n ",i); ??
? ? add() ?;
? ?printf( "%d\n ",i);?
}
?void ? add()
?{ ?
?int ? i=10; ? printf( "%d\n ",i);
?}?
結(jié)果: 5 10 5??
二杈笔。靜態(tài)存儲變量和動態(tài)存儲變量
對于程序運行期間根據(jù)需要進行臨時動態(tài)分配存儲空間的變量?為動態(tài)存儲變量
對于那些程序運行期間永久占用固定內(nèi)存的變量?稱為靜態(tài)存儲變量
?還要說明的是?程序的指令代碼是存放在程序代碼區(qū)的?靜態(tài)存儲變量是存放在靜態(tài)數(shù)據(jù)區(qū)的?包括全局變量等?而程序中的動態(tài)存儲變量存放在動態(tài)數(shù)據(jù)區(qū)?如函數(shù)的形參以及函數(shù)調(diào)用時的返回地址等
? ?1:局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個變量時糕非,會用到同名的局部變量,而不會用到全局變量球榆。對于有些編譯器而言朽肥,在同一個函數(shù)內(nèi)可以定義多個同名的局部變量,比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量持钉,而那個局部變量的作用域就在那個循環(huán)體內(nèi)衡招。
2:全局變量(外部變量)的說明之前再冠以static?就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式每强,靜態(tài)全局變量當然也是靜態(tài)存儲方式始腾。這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個源程序空执,當一個源程序由多個源文件組成時浪箭,非靜態(tài)的全局變量在各個源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域辨绊,即只在定義該變量的源文件內(nèi)有效奶栖, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi)门坷,只能為該源文件內(nèi)的函數(shù)公用宣鄙,因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出默蚌,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期冻晤。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍绸吸。
3:static函數(shù)與普通函數(shù)作用域不同鼻弧,僅在本文件设江。只在當前源文件中使用的函數(shù)應該說明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應該在當前源文件中說明和定義温数。對于可在當前源文件以外使用的函數(shù)绣硝,應該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件
static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次撑刺,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次鹉胖,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份够傍,普通函數(shù)在每個被調(diào)用中維持一份拷貝.
static
static稱為靜態(tài)變量甫菠。根據(jù)變量的類型可以分為靜態(tài)局部變量和靜態(tài)全程變量。
1.?靜態(tài)局部變量
它與局部變量的區(qū)別在于:?在函數(shù)退出時,?這個變量始終存在,?但不能被其它函數(shù)使用,?當再次進入該函數(shù)時,?將保存上次的結(jié)果冕屯。其它與局部變量一樣寂诱。?
例如:
? ?void ?test()
?{
? ?int a = 0;
?a++;
printf(“a = %d\n",a);
?staic ?int b;
?b++;
printf(“b = %d\n",b);
}
int main ()
?{
?test ();
test ();
test ();
return 0;
}
結(jié)果為:a = 1,b = 1;
? ? ? ? a = 1, b = 2;
? ? ? ? a = 1, b = 3;
? 變量b的存儲空間一直在安聘,當?shù)诙握{(diào)用函數(shù)時痰洒,不再對b 賦值,而a 要重新進行內(nèi)存分配浴韭。