變數的屬性有五種:
(1)名字(必須顯示說明)
(2)型別 (必須顯示說明)
(3)儲存類別 (預設方式或顯示說明(使用:auto、register、static、extren))
(4)作用域 (由儲存類別決定)
(5)生存期 (由儲存類別決定)
前兩種不必解釋了,顧名思義。下面詳細區分後三種概念:
定義:指系統對變數儲存方式的規定。
分類:由儲存方式的不同分為兩類:
(1)靜態儲存方式:指在程式執行期間,系統對變數固定地分配儲存空間。即一旦分配,不在變化,直到整個程式執行結束。
(2)動態儲存方式:指在程式執行期間,系統對變數動態地分配儲存空間。即程式執行期間,可根據程式需求,動態分配。
儲存類別既說明了變數的儲存單元,又說明了變數的生存的時間和作用域。
具體包含四種:
在討論一下四種限定符之前,先註明乙個事實:在某乙個程式檔案中定義的全域性變數和函式均預設是外部的!即跨檔案的,但為什麼使用還要加extern?這個稍後再講。
(1)自動變數auto:指不加說明的區域性變數。變數生存期結束由系統自動釋放其儲存空間,故名自動。
(2)暫存器變數register:為提高程式執行效率,允許將區域性變數的值存放於暫存器(而不必存在記憶體)中,但一般不提倡這種做法。
(3)static變數:可作用於區域性變數和全域性變數,故可分為:區域性靜態和全域性靜態。靜態(static)說的是:生存期;而區域性or全域性說的是:作用域(however,此時應注意:由於全域性變數作用域本來就預設為整個程式中,即可垮檔案使用,可一旦加上static修飾,規定:範圍縮小,僅限於本檔案中)。
(4)以extern宣告的變數:指全域性變數,若其要在其他檔案中使用,需加以宣告,方法-->使用前用extern作外部宣告即可(通常放於檔案開頭,並且對於函式而言,通常省略關鍵字extern)。
總的來說:變數的儲存類別+定義變數的位置 =》變數的作用域和生存期
定義:作用,即起作用,有效的意思;域即範圍。連起來就是指:變數的有效範圍,它從空間角度體現變數的特性。
分類(六種):
(1)全域性變數作用域(包括全域性變數和全域性靜態變數兩種);
(2)區域性變數作用域;
(3)語句作用域;
(4)類作用域;
(5)命名空間作用域;
(6)檔案作用域。
定義:指從變數建立至刪除所經歷的時間段,它從時間角度體現變數的特性。
分類(三種):
(1)動態生存期:指存放在「堆區」中的資料。建立、刪除均由程式設計師自己完成。
(2)區域性生存期:指存放在「棧區」中的資料。
(3)靜態生存期:指存放在「(全域性)資料區」中的資料。程式一執行,它們就開始存在;程式一結束,它們就由系統自動釋放。
ps:現在來回答:
為什麼使用還要加extern?
問題完整描述:既然全域性變數(不同於靜態全域性變數)預設是動態的,即作用域整個工程,那麼為什麼在另乙個檔案中還要加extern宣告,才能使用它? 答:
先明確下extern的定義:extern可以置於變數或函式前,以表示變數或函式的定義在別的檔案中,
提示編譯器遇到次變數或函式時應在其他模組中尋找定義。所以extern只是起到乙個提示作用,它與編譯器協同工作。
從編譯器的角度:現代編譯器一般採用
按檔案編譯的方式,即編譯的時候,各個檔案是互相透明的(即不可見)。
這就告訴我們:雖然全域性變數預設為動態,即作用域可以跨檔案到整個工程,但是現代編譯器在編譯的時候限制了這個預設條件。而是在鏈結階段,各個檔案才「合為一體」,故檔案中定義的全域性變數的作用域擴充套件至整個工程是在鏈結之後才完成的。同時,又由於在鏈結階段,若在不同檔案中有相同名字的全域性變數,則會出現重定義的錯誤,即乙個程式的各個檔案中定義的全域性變數不能相同。所以重新定義變數不能解決問題,故只能採取:在乙個檔案中定義的全域性變數,若其他檔案中有需要,則用extern宣告即可,以提示編譯器,此變數的定義要去程式的其他檔案中去找。
因為編譯器的「目光」並不夠長遠,它沒有意識到,某個變數識別符號雖然不是本檔案中定義的,但是可能在其他檔案中有定義,所以需要提示作用,extern由此而來,可算是一種約定。
變數屬性總結
乙個變數除了資料型別以外,還有3種屬性 1 儲存類別 c 允許使用auto,static,register,extern4種儲存類別 函式中的區域性變數,如果不加static宣告,預設就是自動變數 靜態區域性變數 靜態外部變數 2 作用域 指在程式中可以引用該變數的區域 3 儲存期 指變數在記憶體中...
C 變數屬性大總結
乙個變數除了資料型別以外,還有3種屬性 儲存類別 c 允許使用auto,static,register和extern 4種儲存類別。作用域 指程式中可以引用該變數的區域。儲存期 指變數在記憶體的儲存期限。以上3種屬性是有聯絡的,程式設計者只能宣告變數的儲存類別,通過儲存類別可以確定變數的作用域和儲存...
變數的屬性
變數的屬性 今天講這個變數的屬性,實際也就是變數的分類,但自己感覺吧,不是特別的完整,但學到的也就這些吧,歡迎大佬補充。直奔主題!首先先認識一下變數從定義的位置來分 1.塊變數 塊變數 在語句塊中定義的變數,也只能在語句塊中使用。語句塊 裡面,像if語句啊,while,for,do啊,它們的大括號內...