C語言變數的一些認識

來源:互聯網
上載者:User

       從本質上講,變數是程式中用來存放資訊的一塊空間。“這塊空間”一詞,還要加兩個定語。一是所存放的內容是可以(通過代碼來)改變的;二是它的地址是可以訪問的(否則就無法用代碼來訪問它)。這就引出一連串與變數有關的許多問題。

       變數有兩個屬性。一是它的資料類型,就是這個空間能用來存放哪種類型的資料;二是它的時空屬性。本文只涉及及後者。時就是變數的生命期,空就是變數的範圍。

       在C中有兩類變數:在任何函數外面定義的外部變數和在某函數內定義的自動變數。

       儘管在大多數C書裡大談特談全域變數,但是,事實上,在C標準裡,從沒定義過全域變數。C的建立者這麼安排,是有用意的。這體現了C建立者的一個重要思想:盡一切可能限制變數的範圍。他們想限制的還有變數的生命期。這一思想貫穿了整個C標準,也成為後來才出現的結構化程式設計思想的重要內容之一。

       外部變數是源檔案級變數。就是說,它的範圍僅限於定義它的那個源檔案。在源檔案A裡定義的一個外部變數,你要在源檔案B裡訪問它,必須在檔案B的開頭用關鍵字extern聲明它。注意定義和聲明兩個詞,在經典的C書裡,是很小心地區別開的。定義的實質是建立,本質上就是要申請一Block Storage空間。而聲明不引發儲存分配。這裡的聲明,只是使源檔案A裡的某變數的範圍延伸到源檔案B裡。

       在一個工程裡,外部變數必須在一個源檔案裡定義,在其它也需訪問它的每個源檔案裡要extern聲明它。

       在工程裡,如果你在某源檔案裡定義一個變數,並在其它所有源檔案裡聲明它,這個變數就成了全域變數。因此,在C裡,全域變數是靠你自己做出來的。

       在小組開發中,如果你不希望你定義的外部變數被其他人訪問,可以在定義時加上修飾詞static。這樣,這個外部變數的範圍就僅限於定義它的那個源檔案了。如果在其它源檔案裡用extern聲明它,編譯時間就會報錯。一個外部靜態變數就是一個真正的檔案級變數。

       外部變數的生命期是工程的整個運行期間(這裡僅僅指靜態分配的變數,動態分配的不一樣。)。有些書裡稱之為“永久”。

       自動變數分兩級。在函數頭部定義的是函數級,範圍是整個函數;在代碼塊頭部定義的是代碼塊級,範圍僅限這個代碼塊。自動變數在機器執行到定義它的那個函數(或代碼塊)時被建立,離開函數(或代碼塊)時自動消失。再次進入該函數(或代碼塊)時,被再次建立。這就是“自動”的意義。因此,自動變數的生命期僅限該函數(或代碼塊)的一次運行過程。如果在定義時加修飾詞static,就成了自動靜態變數。自動靜態變數的範圍不變,生命期變成永久(整個工程運行期)。自動靜態變數必須有一個初值,作為該函數(或代碼塊)在第一次運行時變數的初值。以後的運行,每一次的初值都是上一次的終值。

       不同範圍的變數允許同名。如果兩個同名變數的範圍互不相交(譬如分處兩個源檔案的的兩個外部靜態變數),那當然互不搭界。如果一個範圍包含另一個範圍,則在程式運行時,會發生屏蔽現象。當進入內層時,外層的變數被內層的同名變數屏蔽。即這時實際訪問的是內層變數。當內層終止時,外層變數便又顯露出來。

       在C++裡,不再限定變數只能在代碼塊的首部定義。這有什麼意義呢?假如,在一個代碼塊裡需要定義一個變數,但是那個變數只是在程式碼片段快終結處才被使用。如果在變數將使用時才定義它,就可以最大限度地限制它的範圍。另外的好處是代碼可讀性更好。因為如果代碼塊很大,定義和引用貼在一起,有利於程式的理解。新的C標準也擴充了這一點。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.