靜態變數有什麼特點
靜態變數是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數,以下是由小編整理關於靜態變數的用法的內容,希望大家喜歡!
靜態變數的用法
靜態變數也可以用於儲存常數。具體來說,靜態變數***全域性變數及組合語言裡定義的符號亦同***可用const,constant或final***根據語言決定***等關鍵字標識,這時其值就會在編譯時***英語:Compile time***設定,並且無法在執行時改變。編譯器通常將靜態常量與文字一起置於目標檔案的文字區域,而非常量初始化資料則置於資料區;而如若有需要,有些編譯器還可選擇為其開闢專用區;為防止常數變數被錯誤的指標寫入覆蓋,亦可在這塊區域啟用記憶體保護機制。
靜態變數的概念定義
“靜態變數”這一術語有兩個容易混淆的定義:
語言無關的通用定義:與程式有著相同生命週期***英語:Object lifetime***的變數;
C族語言特有的定義:以static儲存類宣告的變數。
而在以Pascal為代表的許多程式語言中,所有區域性變數都由系統自動分配儲存空間,而所有全域性變數的儲存空間則以靜態分配的方式獲取***對應“靜態變數”***,因此由於實際上“區域性變數”和“全域性變數”這兩個術語已足以涵蓋所有的情況,在這些程式語言中通常不使用“靜態變數”這一術語,而直接以“全域性變數”代之。一般來說,在這些程式語言中,靜態變數就是全域性變數,而即使在有明確區分全域性和靜態變數的程式語言中,在編譯後的程式碼裡二者也以相同的方式獲取儲存空間。而今術語“靜態變數”的概念則主要基於C族語言的“static”的定義***即定義2***。
靜態變數的特點
靜態區域性變數屬於靜態儲存方式,它具有以下特點:
***1***靜態區域性變數在函式內定義,但不像自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。
***2***靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同,即只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還繼續存在,但不能使用它。
***3***允許對構造類靜態區域性量賦初值。若未賦以初值,則由系統自動賦值。數值型變數自動賦初值0,字元型變數賦空字元。
***4***對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。 根據靜態區域性變數的特點, 可以看出它是一種生存期為整個原始檔的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用, 而且儲存了前次被呼叫後留下的值。 因此,當多次呼叫一個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的副作用,因此仍以採用區域性靜態變數為宜。
靜態變數的不同作用
除明確標識出變數的生命週期***英語:Object lifetime***外,將變數宣告為static儲存類還會根據變數屬性不同而有一些特殊的作用:
對於靜態全域性變數來說,針對某一原始檔的以static宣告的檔案級變數與函式的作用域只限於檔案內***只在檔案內可見***,也即“內部連線”,因而可以用來限定變數的作用域;
對於靜態區域性變數來說,在函式內以static宣告的變數雖然與自動區域性變數的作用域相同***即作用域都只限於函式內***,但儲存空間是以靜態分配而非預設的自動分配方式獲取的,因而儲存空間所在區域不同***一般來說,靜態分配時儲存空間於編譯時在程式資料段分配,一次分配全程有效;而自動分配時儲存空間則是於呼叫棧上分配,只在呼叫時分配與釋放***,且兩次呼叫間變數值始終保持一致;
對於靜態成員變數***英語:Member variable***來說,在C++中,在類的定義中以static宣告的成員變數屬於類變數***英語:Class variable***,也即在所有類例項中共享,與之相對的就是過程變數***又稱例項變數******英語:Instance variable***。
什麼是遠端教育遠端教育如何學習