static
int
a=1;
void
fun1(
void
)
void
fun2(
void
)
void
fun3(
void
)
int
main(
int
argc,
char
** args)
結果是:
1 2 2 2
對於static修飾全域性變數,最主要的作用就是限定了這個全域性變數的作用範圍,不可以被其他類,其他檔案引用。
全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。
全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。
這兩者的區別在於非靜態全域性變數的作用域是整個源程式, 當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。
但是static修飾區域性變數的話,將其放到全域性區,也就是靜態區,當乙個函式裡面有乙個static修飾的區域性變數的時候,如果反覆呼叫多次,那麼下一次函式用的該變數的值不會再被初始化一次了,而是採用上一次函式執行完之後此變數的值。所以,說明:1.static修飾的變數的值是可變的2.只是在此函式的呼叫中為全域性變數。
且需要注意的是,靜態區域性變數只對定義它的函式體始終可見,函式體執行完過後雖然還存在,但是無法被其他的使用了
就是說明,在該函式的呼叫過程中,這個變數作為全域性變數可以被使用。且不隨著函式結束釋放掉,整個程式結束的時候才被釋放掉,但是不被其他的函式所引用。跟真正的全域性變數還是有區別的。真正的全域性變數是所有的函式都可以訪問到。
static修飾區域性變數
普通的區域性變數是在棧上進行分配的,區域性變數所處的函式被多次呼叫時每次呼叫的位置都不一樣的。區域性變數也可以在堆上進行動態的分配,但須記得釋放空間。
靜態區域性變數和普通區域性變數區別如下:
訪問許可權:靜態區域性變數只能被其作用域內的變數和函式進行訪問使用,它雖然存在與程式的整個生命週期,但由於是static的所以不能被其他函式和原始檔訪問。 相當於只是該函式內的全域性變數。
作用位置:靜態區域性變數被編譯器存放在全域性儲存區(data),所以它雖然是區域性的但是卻存在與整個生命週期。
值:靜態的區域性變數如果沒有被初始化,會自動被編譯器賦值為0,以後每次呼叫靜態區域性變數就都會用上次呼叫的值(每次函式呼叫靜態區域性變數都修改它然後離開,下次讀的時候從全域性儲存區讀的靜態區域性變數就是上次修改後的值)。
注意:
由於函式的每次呼叫,普通的區域性變數都會重新分配,而靜態區域性變數會保持上次呼叫的值不變。正是由於static區域性變數的這種特性,使得靜態區域性變數的函式變得不可重入,即每次呼叫可能會產生不同的結果,這在多執行緒程式設計時可能會成為一種隱患。
static修飾全域性變數 區域性變數和函式時候的區別
static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方...
static修飾全域性變數,區域性變數和函式用法
static作用 修飾函式 區域性變數 全域性變數 在c語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。1 先來介紹它的第一條也是最重要的一條 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時...
static 修飾全域性變數 區域性變數和函式的區別
一 全域性變數與static全域性變數 首先要清楚全域性變數本身就是靜態儲存,加上static肯定也是靜態儲存。兩者的主要區別在於作用域。普通的全域性變數其作用域為整個源程式,各個原始檔之間都可以訪問到這個普通全域性變數。靜態的全域性變數其作用域僅為定義該變數的原始檔,其他原始檔訪問不到這個靜態全域...