1.在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,在此函數(shù)外面是不能使用這個(gè)變量,稱之為 "局部變量"。形式參數(shù)也屬于局部變量。在函數(shù)中的一個(gè)程序塊(如某個(gè)復(fù)合語句{...})定義的局部變量只在這個(gè)程序塊中有效,出了程序塊后就無效。
2.有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用之后不消失而保留原值,在下一次該函數(shù)調(diào)用時(shí)該變量已有值,這時(shí)就該制定該局部變量為"靜態(tài)局部變量",用static加以說明。
3.在函數(shù)之外定義的變量稱之為全局變量,全局變量可以為本文件中其他函數(shù)所共用,其有效范圍為:從定義變量開始到本源文件結(jié)束。如果在定義點(diǎn)之前的函數(shù)想應(yīng)用該全局變量,則應(yīng)該在該函數(shù)中使用關(guān)鍵字 extern作外部變量說明,表示該變量在函數(shù)外部定義在函數(shù)內(nèi)部可以使用它。如果在同一個(gè)源文件中,全局變量和局部變量同名,則在局部變量作用范圍內(nèi),全局變量不起作用。如果在其它文件中要引用該文件的全局變量,則需要在應(yīng)用它的文件中,用extern作說明。
4.所謂靜態(tài)全局變量,就是希望某些全局變量只限定于被本文件引用,而不被其它文件引用,這時(shí)可以在定義全局變量的時(shí)候在前面加一個(gè)static說明,
?5 按存儲(chǔ)區(qū)域分,全局變量、靜態(tài)全局變量和靜態(tài)局部變量都存放在內(nèi)存的靜態(tài)存儲(chǔ)區(qū)域,局部變量存放在內(nèi)存的棧區(qū)。
??6?按作用域分,全局變量在整個(gè)工程文件內(nèi)都有效;靜態(tài)全局變量只在定義它的文件內(nèi)有效;靜態(tài)局部變量只在定義它的函數(shù)內(nèi)有效,只是程序僅分配一次內(nèi)存,函數(shù)返回后,該變量不會(huì)消失;局部變量在定義它的函數(shù)內(nèi)有效,但是函數(shù)返回后失效。
??7?全局變量和靜態(tài)變量如果沒有手工初始化,則由編譯器初始化為0。局部變量的值不可知。
8 舉個(gè)例子:
int a;??/*全局*/
static int b;??/*靜態(tài)全局*/
int main()
{
}
這段代碼如果是寫在file.c里面的,那么file2.c就不能調(diào)用b;
但是file2.c中可以通過聲明外部變量extent a;
9.靜態(tài)全局變量 全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。 這兩者在存儲(chǔ)方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序, 當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯(cuò)誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它 的使用范圍。因此static 這個(gè)說明符在不同的地方所起的作用是不同的。應(yīng)予以注意。 |
10 代碼
//test.cpp
#i nclude?<iostream.h>
extern?int?a;//變量聲明,不是定義
static?int?b=5;
void?func1()
{
??cout<<b<<endl<<a<<endl;//結(jié)果為5
}
//main.cpp
int?a;
int?b=10;
void?func2()
{
??static?int?i;
??i++;
??cout<<i<<endl;
}
void?func1();
void?main()
{
??a=20;
??func1();
??func2();
??func2();
}
輸出結(jié)果為
5
20
1
2