【零基礎C語言】- static和extern關鍵字 - 對變量的作用颜凯!

上一篇文章介紹了static和extern對函數(shù)的作用,static用來定義一個內(nèi)部函數(shù)仗扬,不允許其他文件訪問症概;extern用來定義和聲明一個外部函數(shù),允許其他文件訪問早芭。static和extern對變量也有作用彼城,不過跟函數(shù)有點差別。

C語言和Java都有全局變量的概念退个,但是它們的用法還是有些差別的精肃。

一、在Java中帜乞,全局變量的定義沒有嚴格的位置規(guī)定

全局變量可以定義在類的最前面,也可以定義在類的最尾端筐眷,也就說一個方法可以訪問在它之后定義的變量黎烈。

可以看到,第4行定義的test方法可以訪問第8行定義的變量a,這是完全沒有問題的照棋。


二资溃、在C語言中,全局變量定義的位置是有限制的

默認情況下烈炭,一個函數(shù)不可以訪問在它后面定義的全局變量

在第4行定義的main函數(shù)中嘗試訪問第9行定義的變量a溶锭,編譯器直接報錯了。

解決這個錯誤的話符隙,有2種辦法:

第1種辦法:將變量a定義在main函數(shù)的前面

這樣做編譯器就不會找你麻煩了趴捅。

第2種辦法:在main函數(shù)前面對變量a進行提前聲明

也就是讓main函數(shù)知道變量a的存在就行了,至于變量a定義在哪個位置霹疫,main函數(shù)不用管拱绑。

* 完整的變量聲明需要用extern關鍵字

第3行是對變量a進行聲明,第10行是定義變量a丽蝎,再次強調(diào)猎拨,聲明和定義是兩碼事。在第6行操作的就是第10行定義的變量a屠阻。

注意:你不能省略第10行的定義红省,只留下第3行的聲明,因為extern是用來聲明一個已經(jīng)定義過的變量国觉。


三吧恃、重復定義同一個變量

*?其實,你也可以直接在main函數(shù)前面再定義一次a

看到這一幕蛉加,你可能很驚訝蚜枢,但編譯器是不會報錯的。在這種情況下针饥,第3行和第10行的變量a代表著同一個變量厂抽。


*?以此類推,如果我們寫了無數(shù)遍全局變量int a;丁眼,它們代表的都是同一個變量(因為Xcode的編譯器自動在其他的int a前面都加了一個extern關鍵字筷凤,相當于是extern int a。只留一下一個int a用來定義變量a苞七,其他都是在引用變量a)藐守。

第3到第6行、第13到第17行的變量a都代表著同一個變量蹂风。

* 還要注意的一點是卢厂,我們也可以將全局變量a聲明為局部變量后再使用!;葑摹慎恒!

注意:第2任内、第5、第6融柬、第10行都代表著同一個變量死嗦。其實,從第6行a的顏色(淺藍色)都可以看出粒氧,這個a依然是個全局變量越除。

(這是Xcode的特性,如果在函數(shù)內(nèi)部訪問了全局變量外盯,全局變量就會顯示淺藍色摘盆,如果函數(shù)內(nèi)部訪問的是局部變量,局部變量就顯示普通的黑色门怪。當然骡澈,不同的開發(fā)工具有不同的顯示方案)

* 但是,如果你將第5行的extern去掉掷空,那情況就完全不一樣了肋殴,相信有編程經(jīng)驗的你都懂得這是什么情況了

第2、第10行代表著同一個全局變量坦弟,而第5护锤、第6行則是一個局部變量,跟外面的那個全局變量沒有半毛錢的關系酿傍。其實從第5烙懦、6行a的顏色(黑色)都可以看出是個局部變量。


四赤炒、不同源文件中的同名變量

前面講到氯析,你在一個源文件中無論寫多少遍全局變量int a;,它們代表的都是同一個變量莺褒。還有一個事實掩缓,假如在另一個源文件中也有全局變量int a;,那么這兩個源文件的所有全局變量int a;都代表著同一個變量遵岩。extern關鍵字還是適用的你辣,比如:

或者是:

上面的兩種情況下,test.c和main.c中使用的全局變量a都還是代表著同一個變量

注意了尘执,不可以兩個文件的所有全部變量a都用extern舍哄,下面的做法是錯誤的:

因為extern是用來聲明一個已經(jīng)定義過的變量,這兩個文件都是在聲明變量誊锭,沒有人定義變量表悬,在鏈接的時候肯定報錯:

大致錯誤意思是:標示符a未定義


五、static關鍵字

但很多時候丧靡,我們并不想讓源文件中的全局變量跟其他源文件共享蟆沫,相當于私有的全局變量叉讥,那么你就得用static關鍵字來定義變量。

這樣寫完饥追,test.c和main.c的變量a分別代表著不同的變量,它們是沒有聯(lián)系的罐盔、互不干擾的但绕。也就是說,main.c無法訪問test.c中的變量a惶看,因此在main.c中將a修改為10后捏顺,test.c中的a依然為0。輸出結果:

其實static還可以用來修飾局部變量纬黎,這個在《變量類型》中說過幅骄,不再闡述了。

* 因為main.c已經(jīng)沒有權限訪問test.c中的變量a了本今,所以下面的寫法是錯誤的:

extern是用來聲明已經(jīng)定義過而且能夠訪問的變量拆座,雖然test.c中有定義過變量a,但是test.c中變量a的作用域是只限于test.c文件冠息,main.c沒有訪問權限挪凑,所以main.c中的extern是廢的。

鏈接的時候報錯:標示符a未定義

除非main.c自己定義一個變量a逛艰,這樣子extern才是有效的躏碳,不過這時候main.c和test.c中的變量a是分別代表著不同變量


六、static和extern的總結

1散怖、extern可以用來聲明一個全局變量菇绵,但是不能用來定義變量

2、默認情況下镇眷,一個全局變量是可以供多個源文件共享的咬最,也就說,多個源文件中同名的全局變量都代表著同一個變量

3偏灿、如果在定義全局變量的時候加上static關鍵字丹诀,此時static的作用在于限制該全局變量的作用域,只能在定義該全局變量的文件中才能使用翁垂,跟其他源文件中的同名變量互不干擾

對于熱愛編程的小伙伴來說铆遭,路再難走也要堅持走下去!如果你想學習更多知識沿猜,感興趣或者有需求的話枚荣,筆者強烈推薦我專欄的編程技術學習交流聚集地C語言/C++進階之路 - 專題 - 簡書!還有完整的學習路線圖和學習文件視頻哦啼肩,小白和大神們正在等著你一起探討編程橄妆,極佳的學習氛圍衙伶!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市害碾,隨后出現(xiàn)的幾起案子矢劲,更是在濱河造成了極大的恐慌,老刑警劉巖慌随,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芬沉,死亡現(xiàn)場離奇詭異,居然都是意外死亡阁猜,警方通過查閱死者的電腦和手機丸逸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃袍,“玉大人黄刚,你說我怎么就攤上這事∶裥В” “怎么了憔维?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長研铆。 經(jīng)常有香客問我埋同,道長,這世上最難降的妖魔是什么棵红? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任凶赁,我火速辦了婚禮,結果婚禮上逆甜,老公的妹妹穿的比我還像新娘虱肄。我一直安慰自己,他們只是感情好交煞,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布咏窿。 她就那樣靜靜地躺著,像睡著了一般素征。 火紅的嫁衣襯著肌膚如雪集嵌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天御毅,我揣著相機與錄音闽烙,去河邊找鬼语泽。 笑死乔外,一個胖子當著我的面吹牛考赛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播今豆,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼嫌拣,長吁一口氣:“原來是場噩夢啊……” “哼柔袁!你這毒婦竟也來了?” 一聲冷哼從身側響起异逐,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捶索,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灰瞻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情组,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年箩祥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肆氓。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡袍祖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谢揪,到底是詐尸還是另有隱情蕉陋,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布拨扶,位于F島的核電站凳鬓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏患民。R本人自食惡果不足惜缩举,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匹颤。 院中可真熱鬧仅孩,春花似錦、人聲如沸印蓖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赦肃。三九已至溅蛉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間他宛,已是汗流浹背船侧。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堕汞,地道東北人勺爱。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像讯检,于是被迫代替她去往敵國和親琐鲁。 傳聞我的和親對象是個殘疾皇子卫旱,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容