http://blog.csdn.net/woxiaohahaa/article/details/51014224
參考自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html?(華山大師兄)
這里我們只討論了C語言的static
首先我們回顧一下各種變量在內存中的位置:
BSS和DATA段都屬于靜態數據區,在進程運行過程中,靜態數據區的數據始終存在。靜態全局變量和其他全局變量的存儲地點沒有區別,因此還是在BSS和DATA中。但是,靜態全局變量僅在定義它的源文件中有效,其他文件即使用extern聲明也沒法使用他。準確地說作用域是從定義之處開始,到文件結尾處結束,在定義之處前面的那些代碼行也不能使用它。
1、靜態的全局變量和函數
當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。
舉個例子:
以上代碼成功編譯連接后,輸出 A Hello。
我們知道,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,并且都沒有加static前綴,因此對于另外的源文件b.c是可見的。
但是,如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,b.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名全局變量,而不必擔心命名沖突。
2、靜態的局部變量
static局部變量在函數內定義,它的生存期為整個程序運行過程,但是其作用域仍與自動變量相同,只能在定義該變量的函數內使用該變量。退出該函數后, 盡管該變量還繼續存在,但不能使用它。
舉個例子:
輸出如下:
基于以上兩點,我們得出:把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,?限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。
3、未手動初始化的static變量和全局變量默認初始化為0
未手動初始化的static變量和全局變量都存儲在 BSS 段,該區域的變量的值都為0。
某些時候這一特點可以減少程序員的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把一個字符數組當字符串來用,但又覺得每次在字符數組末尾加‘\0’;太麻煩。如果把字符串定義成靜態的,就省去了這個麻煩,因為那里本來就是‘\0’;不妨做個小實驗驗證一下。
運行結果為:integer: 0; string: (begin) (end)