【C/C++】关键字static
http://blog.csdn.net/woxiaohahaa/article/details/51014224
參考自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html?(華山大師兄)
這里我們只討論了C語言的static
首先我們回顧一下各種變量在內(nèi)存中的位置:
BSS和DATA段都屬于靜態(tài)數(shù)據(jù)區(qū),在進(jìn)程運(yùn)行過程中,靜態(tài)數(shù)據(jù)區(qū)的數(shù)據(jù)始終存在。靜態(tài)全局變量和其他全局變量的存儲地點(diǎn)沒有區(qū)別,因此還是在BSS和DATA中。但是,靜態(tài)全局變量僅在定義它的源文件中有效,其他文件即使用extern聲明也沒法使用他。準(zhǔn)確地說作用域是從定義之處開始,到文件結(jié)尾處結(jié)束,在定義之處前面的那些代碼行也不能使用它。
1、靜態(tài)的全局變量和函數(shù)
當(dāng)同時(shí)編譯多個(gè)文件時(shí),所有未加static前綴的全局變量和函數(shù)都具有全局可見性。
舉個(gè)例子:
[cpp]?view plaincopy
我們知道,所有未加static前綴的全局變量和函數(shù)都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數(shù),并且都沒有加static前綴,因此對于另外的源文件b.c是可見的。
但是,如果加了static,就會(huì)對其它源文件隱藏。例如在a和msg的定義前加上static,b.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數(shù)和同名全局變量,而不必?fù)?dān)心命名沖突。
2、靜態(tài)的局部變量
static局部變量在函數(shù)內(nèi)定義,它的生存期為整個(gè)程序運(yùn)行過程,但是其作用域仍與自動(dòng)變量相同,只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。
舉個(gè)例子:
[cpp]?view plaincopy
輸出如下:
基于以上兩點(diǎn),我們得出:把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,?限制了它的使用范圍。因此static 這個(gè)說明符在不同的地方所起的作用是不同的。
3、未手動(dòng)初始化的static變量和全局變量默認(rèn)初始化為0
未手動(dòng)初始化的static變量和全局變量都存儲在 BSS 段,該區(qū)域的變量的值都為0。
某些時(shí)候這一特點(diǎn)可以減少程序員的工作量。比如初始化一個(gè)稀疏矩陣,我們可以一個(gè)一個(gè)地把所有元素都置0,然后把不是0的幾個(gè)元素賦值。如果定義成靜態(tài)的,就省去了一開始置0的操作。再比如要把一個(gè)字符數(shù)組當(dāng)字符串來用,但又覺得每次在字符數(shù)組末尾加‘\0’;太麻煩。如果把字符串定義成靜態(tài)的,就省去了這個(gè)麻煩,因?yàn)槟抢锉緛砭褪恰甛0’;不妨做個(gè)小實(shí)驗(yàn)驗(yàn)證一下。
[cpp]?view plaincopy
總結(jié)
以上是生活随笔為你收集整理的【C/C++】关键字static的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月经不调推迟会不会不孕不育
- 下一篇: C++ 类模板二(类模版与友元函数)