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