c語言的一些回顧------關鍵字之存儲類別描述符

                                                    c語言的一些回顧------關鍵字之存儲類別描述符編程

    距離大一學C語言已經有三年的時間了,如今大部份內容都記得不是很清楚了,如今忽然萌發了重溫C語言的想法,古人說的好,溫故而知新嘛,雖然這個「故」有點過久遠了,但願能爲你們在回顧以往知識的時候提供一點幫助,好了廢話很少說了,進入主題吧!windows

     首先先講講C語言的歷史吧,不想看的直接跳過吧,C語言最先是爲了在PDP-11計算機上運行的UNIX系統所設計出來的編程語言,爲啥叫C呢,由於C語言的不少特性是由一種更早的被稱爲B語言的編程語言中發展而來,咱們知道早期操做系統的核心大多由彙編語言組成(超難理解的,檢錯也超難啊,佩服以前的內核開發者啊),由於C語言容許直接訪問內存地址,能夠直接對硬件進行操做,所以它既具備高級語言的功能,又具備低級語言的許多功能,可以像彙編語言同樣對位、字節和地址進行操做,而這三者是計算機最基本的工做單元,並且C語言也很適合搭配彙編語言來使用,因此慢慢的C語言就逐漸的成爲操做系統的核心,咱們熟知的Linux系統內核就全是用C語言和部分彙編寫的。編程語言

     好吧進入具體內容啦,本篇就從關鍵字入手來回顧一下吧,其實大部分人都不知道關鍵字有多少個,哪些是關鍵字,舉個簡單的例子,我給你們提個問,sizeof是關鍵字嗎?我估計不少人的回答是含糊的,由於我身邊就有很多同窗就是這樣,爲何會這樣呢?實際上是被咱們常用sizeof(i)使得咱們認爲sizeof是一個系統提供的函數,其實否則,因此我就先對C語言的32個關鍵字先一一作個簡單的介紹吧。函數

     auto :最沒有存在感的關鍵字,C語言提供了四種存儲類別說明符auto,register,extern,static,四種存儲類別說明符有兩種存儲期:自動存儲期和靜態存儲期。其中auto和register對應自動存儲期。具備自動存儲期的變量在進入聲明該變量的程序塊是被創建,它在該程序塊活動時存在,退出該程序塊時撤銷。編譯器對於全部的變量默認缺省的狀況下都是auto的,在函數內部定義的變量成爲局部變量,因此呢在某些C語言教材中,局部變量稱爲自動變量。spa

     Ok,進入下一個關鍵字,它被稱做最快的關鍵字,它就是register,它和auto同樣都是自動儲存器的存儲類別說明符,它讓修飾的變量儘量的存在CPU的寄存器中而不是經過內存尋址訪問,從而來提升效率,可是注意這裏只是說盡量,由於一個CPU的寄存器數量是不多的,不可能要求你把每一個變量都放進寄存器,因此呢我作了一個試驗,若是變量能夠取址的話就說明變量時存放在內存中的,不然則不是,可是基本每次都是能夠取址的,因此如今咱們能夠理解爲何register的功能是儘量放在寄存器了吧。除此以外還有就是由於變量要放在寄存器中,因此register變量必須是CPU寄存器可以接受的類型,你要是放一個double類型的數據到一個32位的寄存器裏就不行了。操作系統

    講完了兩種自動儲存器的存儲類別說明符,接下來開始講另外兩種存儲類別說明符:static和extern,首先講static,其實它的做用和名字沒啥關係,索性就把它稱爲最名存實亡的關鍵字吧,由於有人曾經這麼叫過,它有兩個做用一個就是修飾變量,被它修飾的變量都存放在內存的靜態區,這裏有些同窗可能對靜態區不太瞭解,所以在這裏囉嗦一下,基本上可編程內存數據區分爲這樣的幾大部分:靜態存儲區、堆區和棧區。他們的功能不一樣,所以對他們使用方式也就不一樣,首先什麼是靜態存儲區,其實它在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在,它主要存放靜態數據、全局數據和常量。什麼是堆區呢,咱們在寫程序時能夠用malloc或new申請任意大小的內存,就是動態內存分配啦,使用完內存之後用free或delete釋放內存,因此說動態內存的生存期是由咱們本身決定的,若是咱們不釋放內存,程序將在最後釋放掉動態內存。可是若是說咱們在程序中分配的動態內存再也不使用,咱們有義務將其釋放掉,不然,一旦指針變量被釋放之後,就再也找不到它所指的那塊內存了,這時就發生了內存泄漏。最後是棧區呢,就是咱們在執行函數體的時候會建立一些變量,這些局部變量就是在棧上建立的,函數結束時這些存儲單元自動被釋放,棧內存分配運算是內置於處理器的指令集中,建立的效率是很高,可是分配的內存容量有限,windows下是2M或者1M,因此編程注意不要堆棧溢出哦。還要補充的是代碼區,也就是存放函數的二進制代碼,最後就是文字常量區,好比一些常量字符串就是放在這裏的,程序結束後由系統自動釋放,和咱們無關,咱們在調用的函數名其實就是函數指針,它指向代碼區,是程序運行的指令代碼,數據指針指向數據,堆,棧區,是咱們程序賴以運行的各類數據。剛說到static的做用是修飾變量,分兩種,一種是靜態全局變量,它的做用域僅限於變量被定義的文件裏,更準確的來講是從變量定義處到文件結尾,其餘文件即便使用extern聲明也木有用,並且在定義文件內定義前使用要想使用它的話,必須加上extern聲明。另一種就是靜態局部變量,就是在函數體裏面定義的,其它函數使用不了。好了說完static的一個做用之後,接下來講另一個做用就是修飾函數,咱們知道若是一個項目工程很大的話管理起來就比較複雜,很容易出現重名,重複定義的狀況,因此static就出來解決這個問題,使用static修飾的函數成爲靜態函數,就是說該函數的做用域僅限於本文,這樣一來不一樣的人編寫不一樣的函數,徹底不用擔憂本身的函數是否會與其餘文件裏的函數重名啦。設計

      說完了上面三個,剩下就差一個存儲類別說明符,就是extern,怎麼說呢,這個就是一個聯絡員吧,它告訴編譯器某個變量或者函數的定義在別的文件裏面,說到這裏順便提一下變量的聲明和定義,其實定義就是一種定義性聲明,它創建存儲空間,而通常意義的聲明其實指的是引用性聲明,它起的做用就是告知編譯器這個變量在別處已經定義過了,再也不創建存儲空間,由於已經創建存儲空間了,一個變量必須被定義一次,最多一次,至少一次,並且必須在使用前定義或者聲明。指針

     好了此次的回顧就先到這裏,有時間接着寫,也但願和歡迎你們批評指正!!!內存

                                                                                                                  2014年2月28日 by ido_1992作用域

相關文章
相關標籤/搜索