變數的屬性有五種:
(1)名字(必須顯示說明)
(2)型別 (必須顯示說明)
(3)儲存類別 (預設方式或顯示說明(使用:auto、register、static、extren))
(4)作用域 (由儲存類別決定)
(5)生存期 (由儲存類別決定)
變數的儲存類別
定義:指系統對變數儲存方式的規定。
分類:由儲存方式的不同分為兩類:
(1)靜態儲存方式:指在程式執行期間,系統對變數固定地分配儲存空間。即一旦分配,不在變化,直到整個程式執行結束。
(2)動態儲存方式:指在程式執行期間,系統對變數動態地分配儲存空間。即程式執行期間,可根據程式需求,動態分配。
儲存類別既說明了變數的儲存單元,又說明了變數的生存的時間和作用域。
具體包含四種:
(1)自動變數auto:指不加說明的區域性變數。變數生存期結束由系統自動釋放其儲存空間,故名自動。
(2)暫存器變數register:為提高程式執行效率,允許將區域性變數的值存放於暫存器(而不必存在記憶體)中,但一般不提倡這種做法。
(3)static變數:可作用於區域性變數和全域性變數,故可分為:區域性靜態和全域性靜態。
靜態說的是:生存期(life cycle);
區域性、全域性說的是:作用域(action scope)
此時應注意:由於全域性變數作用域本來就預設為整個程式中,即可垮檔案使用公有。一旦加上static修飾,則隱藏了變數或函式名字,使之成為本檔案(模組)私有。
(4)extern宣告的變數:指全域性變數,若其要在其他檔案中使用,需加以宣告,方法–>使用前用extern作外部宣告即可(通常放於檔案開頭,並且對於函式而言,通常省略關鍵字extern)。
變數的作用域
定義:作用,即起作用,有效的意思;域即範圍。連起來就是指:變數的有效範圍,它從空間角度體現變數的特性。
分類(六種):
(1)全域性變數作用域(包括全域性變數和全域性靜態變數兩種);
(2)區域性變數作用域;
(3)語句作用域;
(4)類作用域;
(5)命名空間作用域;
(6)檔案作用域。
變數的生存期
定義:指從變數建立至刪除所經歷的時間段,它從時間角度體現變數的特性。
分類(三種):
(1)動態生存期:指存放在「堆區」中的資料。建立、刪除均由程式設計師自己完成。
(2)區域性生存期:指存放在「棧區」中的資料。
(3)靜態生存期:指存放在「(全域性)資料區」中的資料。程式一執行,它們就開始存在;程式一結束,它們就由系統自動釋放。
在某乙個程式檔案中定義的全域性變數和函式均預設是外部的!即跨檔案的,但為什麼使用還要加extern?
ps:為什麼使用還要加extern?
問題完整描述:既然全域性變數(不同於靜態全域性變數)預設是動態的,即作用域整個工程,那麼為什麼在另乙個檔案中還要加extern宣告,才能使用它?
答:先明確下extern的定義:extern可以置於變數或函式前,以表示變數或函式的定義在別的檔案中, 提示編譯器遇到次變數或函式時應在其他模組中尋找定義。所以extern只是起到乙個提示作用,它與編譯器協同工作。
從編譯器的角度:現代編譯器一般採用 按檔案編譯的方式,即編譯的時候,各個檔案是互相透明的(即不可見)。
這就告訴我們:雖然全域性變數預設為動態,即作用域可以跨檔案到整個工程,但是現代編譯器在編譯的時候限制了這個預設條件。而是在鏈結階段,各個檔案才「合為一體」,故檔案中定義的全域性變數的作用域擴充套件至整個工程是在鏈結之後才完成的。同時,又由於在鏈結階段,若在不同檔案中有相同名字的全域性變數,則會出現重定義的錯誤,即乙個程式的各個檔案中定義的全域性變數不能相同。所以重新定義變數不能解決問題,故只能採取:在乙個檔案中定義的全域性變數,若其他檔案中有需要,則用extern宣告即可,以提示編譯器,此變數的定義要去程式的其他檔案中去找。
因為編譯器的「目光」並不夠長遠,它沒有意識到,某個變數識別符號雖然不是本檔案中定義的,但是可能在其他檔案中有定義,所以需要提示作用,extern由此而來,可算是一種約定。
C語言變數屬性
在c語言中,變數是具有屬性的,主要有auto static register extern auto 區域性變數的自動預設屬性,不需要顯示宣告,且儲存在棧上 register 暫存器變數,請求編譯器將區域性變數儲存在暫存器中,由於是請求,編譯器有可能拒絕,所以儘管利用register對變數進行了修飾...
C語言中變數屬性
事物的難度遠遠低於對事物的恐懼!這章來聊聊變數的屬性,玩過遊戲的朋友都知道,遊戲裡各個角色都有各自特定的屬性,才有了各個角色的功力不同,這個只能打小妖而那個卻能戰大怪,這就因為它們具有不同的屬性。而在c語言中,變數也可以有自己的屬性,屬性不同,變數的在程式中具有的特性也不同。那麼如何給變數加上自己的...
思考C語言變數的幾個「屬性」
儲存型別 資料型別 變數名 1 資料型別 眾所周知,如int float 等基本資料型別和結構體 列舉等構造資料型別,不做討論。2 儲存週期 主要有三種 auto 預設時預設的儲存型別,進入語句塊時自動申請記憶體,退出時自動釋放記憶體 不初始化時,值是不確定的。register 不需要我們人為制定。...