亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言之作用域

2019-11-10 20:38:05
字體:
來源:轉載
供稿:網友

轉載 http://blog.csdn.net/leaf1984zh/article/details/5964256

C語言之作用域在C語言中,涉及到作用域和生存周期的問題,大多是指的變量和函數。C語言中用得最多的應當算是局部變量了,而局部變量的作用域一般認為在函數體內有效。局部變量的內存分配管理和銷毀是由編譯器來實現的,程序編寫者不用考慮其實現細節。當函數執行完成返回時,局部變量將全部被銷毀,這決定了其生存周期。這里涉及到返回值的問題,至于是在返回值傳遞完成之后銷毀呢,還是將返回值拷貝到一個臨時變量中,銷毀全部的局部變量,再將臨時變量返回呢,這是由編譯器的設計者所決定的。目前大多數的C編譯器是采用的后者的設計方案。剛剛提到局部變量的作用域一般認為是在函數體內。但是根據C99標準,該說法有了變化。在新的標準中,允許即時定義局部變量,示例如下:for( int i = 0; i < MAXSIZE; i++ ){….}例子中的局部變量i的作用域即在for循環的花括號中,當for循環結束的時候,局部變量i的生存周期同時結束。也就是說,在下一個for循環中,你仍然可以再次重新定義并使用名為i的局部變量。該語法只能在C99之后的新的C編譯器中使用, 例如VC2005、VC2008、gcc4.2及以上版本。但是,該語法帶來了編程風格的變化,而且變量隱含在了執行程序中,無論是代碼的閱讀和維護都有較大的困難,因此工程項目中不建議使用該語法。程序代碼,是為了方便別人閱讀而寫的,而不是只有自己能夠閱讀。只有自己才能讀得懂的代碼,是沒有使用價值的。函數退出時被銷毀的局部變量包括整型、浮點型、數組、函數體中定義的指針(指針,對于編譯器來說,它看到的依然是一個整型的變量而已)??隙ㄓ腥藭柕?,如果想要函數體中的局部變量在函數退出時不被銷毀,那該怎么辦呢?其實這也簡單,你只需要在定義的局部變量的前面加上static關鍵字,將其聲明為靜態變量即可。注意,靜態變量的初始化只有一次,也就是當函數第一次被調用的時候將對靜態變量進行初始化,之后類似于int i = 0這樣的語句將會失效。一旦聲明為靜態變量,程序沒有退出,靜態變量將一直存在。使用靜態變量的時候,一定要清楚為什么要使用靜態變量,而不是僅僅為了某次操作,能夠方便取得函數體中的某個變量的值而已。雖然其生存周期發生變化了,但是它的作用域依然限制在函數體的范圍內。把變量定義在函數體外,就是全局變量。全局變量的生命周期等同于程序執行時間,程序開始執行時,全局變量將被執行初始化(這與靜態變量不同,靜態變量是執行函數時才初始化的)。全局變量的優勢就是,你可以在任何時候,任何函數中方便的訪問到,實現數據共享。但同時,也存在共享數據被篡改的可能,尤其是多線程操作的時候,必須對每次操作進行加鎖。在默認狀態下,全局變量可以被工程項目中的任何文件和函數訪問。但是,不同文件有所區別。如果是在定義全局變量的c文件中,無需聲明就可以使用該變量;其他的c文件中,只需使用extern關鍵字進行聲明(不是定義),即可使用。聲明時,不能對全局變量進行賦值操作。全局變量一般不在h頭文件中定義,容易發生重定義錯誤。extern int i ; 在C語言中,函數被默認為是全局的,只要在頭文件中進行了聲明,你可以在工程中的任何位置使用。在h頭文件中,聲明為int Foo(); 和extern int Foo(); 其實質是一樣的。除此之外,你還可以將函數冠以static關鍵字,將其定義為靜態函數。其意義在于,更改了函數的作用范圍。聲明為static的函數,只能在定義該函數體的c文件中使用,其他位置的程序段無法使用聲明為static的函數。由于作用域的范圍沒有沖突,于是,你可以定義與聲明為static同名的另一個函數,至于這個函數是全局的,還是靜態的,無關緊要。因為在定義了同名的static函數的c文件中,編譯器只會使用標記有static的函數,而忽略外部的全局函數。很少討論函數的生存周期,因為函數執行完成退出時,被認為其生命周期的結束。就算該函數再次被調用,那也是新的生存周期。另外,C語言中還有auto關鍵字,其實那更多的是編譯器自己在用,而對于程序編寫者來說,可以忽略掉。  大多數的書籍和文章對變量和函數的討論也就到此結束了。而我想在這里談論一下其他的幾個方面: 宏定義C語言中的宏定義是一個偉大的創新,也被稱作是個愚蠢的設計。其實宏定義在程序的編譯階段就完成了,因此也就不存在生命周期這回事。通常宏定義出現在h頭文件之中,也就是說只要你包含了這個頭文件,你就可以用宏定義了;如果是定義在c文件之中的,那就只能在該c文件中使用了。 結構體工程項目中,通常都是使用公共結構體來實現不同函數(或者功能模塊)間的數據傳遞。公共結構體一般定義在外層的h頭文件中。至于你要將其實例化為全局變量,還是局部變量,那需根據實際情況而定。 內存管理前面提到的局部變量內存空間的申請銷毀,是由編譯器實現的。而使用malloc函數進行動態分配的內存空間,才需要使用free函數手動釋放。關于內存分配管理很多中文書本都略過不談,為什么呢?因為寫書的人自己都沒弄明白,結果給很多人帶來困惑?;蛟S這本身確實很復雜,但卻可以簡單的解釋下。原則上,一個程序能夠使用的內存的范圍是操作系統分配給程序的那部分。而這部分內存將隨程序的退出而返還給操作系統。那么free執行的操作是什么呢?free函數釋放的內存空間,實際上是釋放給了程序本身,而不是操作系統。釋放的空間可以再次分配給程序的其他函數體使用,而不需要再向操作系統申請,操作系統一般也不能夠隨便收回程序所正在使用的內存空間。(如果能夠,那需要操作系統和編譯器的支持才行。)程序使用free釋放的內存空間,是程序的所有函數體所共享的。底層操作均由編譯器實現,不需要程序編寫者考慮。說簡單點,malloc首先要求分配內存,若程序中剩余空間不能滿足,就向操作系統要資源,用完了后不把這部分資源還給操作系統,直到程序的退出,操作系統才能對內存進行回收。這就是為什么程序占用內存始終是越來越多。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲自拍| 日韩精品在线视频观看| 国产精品av免费在线观看| 国产日韩亚洲欧美| 成人福利免费观看| 17婷婷久久www| 欧美日韩国产综合新一区| 久久久久久国产| 黑人巨大精品欧美一区免费视频| 国产亚洲欧美日韩一区二区| 国产精品扒开腿做爽爽爽的视频| 国产精品户外野外| 欧美激情精品久久久久久久变态| 亚洲片国产一区一级在线观看| 欧美日韩美女视频| 亚洲人av在线影院| 国产精品视频免费观看www| wwwwwwww亚洲| 亚洲少妇中文在线| www国产亚洲精品久久网站| 欧洲亚洲免费视频| 大量国产精品视频| 欧美性极品少妇精品网站| 欧美日韩在线观看视频小说| 一区二区三区www| 操人视频在线观看欧美| 成人激情综合网| 992tv在线成人免费观看| 亚洲视频电影图片偷拍一区| 亚洲精品福利在线观看| 国产噜噜噜噜久久久久久久久| 成人精品一区二区三区电影黑人| 欧美午夜激情在线| 中文字幕日韩av| 欧美日韩中文字幕| 国产美女被下药99| 麻豆国产精品va在线观看不卡| 国产精品h片在线播放| 日韩av免费网站| 国产一区二区免费| 久久免费视频在线| 欧美日韩在线另类| 国产免费一区二区三区在线能观看| 亚洲精品在线视频| 久久久久中文字幕2018| 色系列之999| 国产精品视频在线观看| 91精品啪在线观看麻豆免费| 国产不卡一区二区在线播放| 欧美日韩亚洲一区二| 欧美第一淫aaasss性| 国产成人精品综合| 国模精品系列视频| 欧美日韩午夜视频在线观看| 国产一区二区三区网站| 夜夜嗨av色一区二区不卡| 日韩一区二区三区在线播放| 国产日韩欧美视频| 日韩美女在线看| 久久久国产影院| 亚洲免费av网址| 国产综合久久久久久| 欧美网站在线观看| 日韩av在线免费观看| 亚洲美女av电影| 久久综合免费视频影院| 国产一区二区三区在线免费观看| 亚洲美女性生活视频| 美女扒开尿口让男人操亚洲视频网站| 国产精品爽爽ⅴa在线观看| 日本a级片电影一区二区| 综合久久五月天| 欧美日韩在线第一页| 国产成人精品免高潮在线观看| 中文精品99久久国产香蕉| 国产一区二区三区丝袜| 日韩欧美一区二区三区久久| 91社影院在线观看| 日韩av综合中文字幕| 国产精品白嫩初高中害羞小美女| 国产成人av网址| 亚洲自拍小视频免费观看| 亚洲精品美女久久久久| 亚洲影视九九影院在线观看| 欧美成人亚洲成人| 欧美色视频日本高清在线观看| 精品偷拍一区二区三区在线看| 亚洲欧洲偷拍精品| 久久久久北条麻妃免费看| 91精品久久久久久久久久久久久久| 亚洲第一页自拍| 91精品免费看| 亚洲嫩模很污视频| 亚洲国产日韩欧美在线99| 欧美丝袜一区二区| 国产午夜精品美女视频明星a级| 欧美成人一区在线| 欧美日韩中国免费专区在线看| 成人动漫网站在线观看| 日韩精品福利网站| 久久精品国产清自在天天线| 日韩成人在线视频| 国产精品久久久久久久久久尿| 91精品国产乱码久久久久久蜜臀| 日韩成人中文字幕| 亚洲va欧美va国产综合剧情| 亚洲精品自拍第一页| 日韩在线视频网站| 日韩电影在线观看中文字幕| 欧美一级bbbbb性bbbb喷潮片| 茄子视频成人在线| 日本在线观看天堂男亚洲| 日本一区二三区好的精华液| www.久久草.com| 亚洲激情视频网站| 九九精品在线观看| 日韩美女毛茸茸| 97在线视频精品| 综合网日日天干夜夜久久| 日韩精品有码在线观看| 国产成人综合一区二区三区| 日本精品视频在线播放| 日产精品99久久久久久| 成人免费视频在线观看超级碰| 欧美一区二区大胆人体摄影专业网站| 国产精品高潮在线| 日韩成人免费视频| 亚洲成色777777女色窝| 日本韩国欧美精品大片卡二| 亚洲美女自拍视频| 91色视频在线观看| 日本不卡免费高清视频| 国产色视频一区| 亚洲大胆人体视频| 亚洲男人天堂视频| 亚洲午夜精品视频| 欧美日韩日本国产| 欧美视频裸体精品| 俺去啦;欧美日韩| 91精品国产色综合久久不卡98| 亚洲精品一区中文字幕乱码| 久久久久久久91| 性色av一区二区三区红粉影视| 夜色77av精品影院| 在线视频免费一区二区| 久久久成人的性感天堂| 成人高h视频在线| 久久国产精品久久久久久久久久| 精品视频久久久久久久| 久久免费福利视频| 国产日韩精品在线播放| 亚洲欧美精品伊人久久| 国内精品400部情侣激情| 中文字幕综合在线| 久久精品电影网| 正在播放国产一区| 欧美视频在线免费看| 亚洲男人av在线| 26uuu国产精品视频| 色偷偷噜噜噜亚洲男人| 久久久成人av| 日韩av在线天堂网| 成人女保姆的销魂服务| 视频直播国产精品|