首先,必須明白乙個程式是包含若干個原始檔,每個原始檔又是包含若干個函式,每個原始檔、函式中又定義了若干個變數。但是每個變數都有自己的作用範圍,也就是自己的作用域。只有在作用域內才可以訪問變數。
變數的有效範圍稱為變數的作用域( scope)。歸納起來,變數有4種不同的作用域:檔案作用域( file scope)、函式作用域( function scope)、塊作用域(block scope)和函式原型作用域( function prototype scope)。檔案作用域是全域性的,其他三者是區域性的。
除了變數之外,任何以識別符號代表的實體(如函式、陣列.結構體.類等)都有作用域概念,與變數的作用域類似。
區域性變數和全域性變數
1.區域性變數
在乙個函式內部定義的變數稱之為內部變數(區域性變數),只在函式內有效。需要注意的是,函式原型宣告中出現的引數名,只在原型宣告括號中有效,他並不是實際存在的變數,不能被引用,編譯系統對此變數名忽略,即使在呼叫函式時也不為其分配儲存空間。
2.全域性變數
在函式外定義的變數是外部變數,稱為全域性變數,有效範圍是從定義點到本原始檔結束。需要注意的是儘管全域性變數可以增加函式之間的資料交流,但仍然不建議過多使用全域性變數,原因如下:
(1)全域性變數在程式的全部執行過程中都占用儲存單元,而不是僅在需要時才開闢單元。即分配在靜態儲存區。
(2)它使函式的通用性降低了,因為在執行函式時要受到外部變數的影響。如果將乙個函式移到另乙個檔案中,還要將有關的外部變數及其值一起移過去。但若該外部變數與其他檔案的變數同名,就會出現問題,降低了程式的可靠性和通用性。,
(3)在程式設計中,一般要求把程式中的函式做成乙個封閉體,除了可以通過「實參形參」的渠道與外界發生聯絡外,沒有其他渠道。這樣的程式移植性好,可讀性強。使用全域性變數過多,會降低程式的清晰性,人們往往難以清楚地判斷出每個瞬時各個全域性變數的值。在各個函式執行時都可能改變全域性變數的值,程式容易出錯。因此,要限制使用全域性變數。
(4)如果在同乙個原始檔中,全域性變數與區域性變數同名,則在區域性變數的作用範圍內,全域性變數被遮蔽,即它不起作用,此時可以使用區域性變數。
變數的儲存方式
動態儲存方式與靜態儲存方式
上面講到的變數的一種屬性作用域,作用域是從空間的角度來分析的,分為全域性變數和區域性變數。變數還有另一一種屬性一儲存期( storage duration,也稱生命期)。儲存期是指變數在記憶體中的存在週期。這是從變數值存在的時間角度來分析的。儲存期可以分為靜態儲存期( static storage duration) 和動態儲存期( dynamicstorage duration)。這是由變數的靜態儲存方式和動態儲存方式決定的。
所謂靜態儲存方式是指在程式執行期間,系統對變數分配固定的儲存空間。而動態儲存方式則是在程式執行期間,系統對變數動態地分配儲存空間。
變數的儲存位置
先看一下記憶體中的供使用者使用的儲存空間的情況,可以將其分為三部分:
(1)程式區 (2)靜態儲存區 (3)動態儲存區
程式中所用的資料存放在靜態儲存區與動態儲存區中。
全域性變數全部存放在靜態儲存區中,在程式開始執行時就給全域性變數分配儲存單元,程式執行完畢釋放這些空間。程式執行過程中佔據固定的空間。
動態儲存區中存放:(1)函式形參(2)函式內定義的變數(未加static) (3)函式呼叫時的現場保護和返回位址等。當函式呼叫的時候才申請空間,函式執行完立即釋放。
變數的儲存類別
1.自動儲存
函式中的區域性變數,不用static宣告時,編譯系統對其動態分配儲存空間。
注意:在復合語句中定義的變數,只在定義時分配空間,復合語句結束時自動釋放空間。用關鍵字auto宣告儲存類別,使用舉例:auto int a; 但是auto可以省略。即預設為自動變數。
2.static宣告靜態區域性變數
(1)靜態區域性變數在靜態儲存區內分配儲存單元。在程式整個執行期間不釋放。
(2)對靜態區域性變數是在編譯時賦初值的,所以只賦一次,在程式執行時就存在初值。以後的對其每次呼叫使用的是上一次函式結束的值。如果未賦初值,預設為0或空字元。而動態分配的結果不確定。
(3)靜態區域性變數對其他函式來講是不可見的。
3.用register宣告的暫存器變數
一般情況下,變數的值存放在記憶體當中。當程式使用到那乙個變數的值的時候,由控制器發出指令將記憶體中該變數的值送到cpu中的運算器,如果結果需要儲存,則再送回到記憶體中。
如果有一些變數使用頻繁,比如i在for中迴圈使用10000次,則訪問變數需要花費很多時間。c++允許將區域性變數的值放在cpu的暫存器當中,需要時直接從暫存器中取出,因此可以提高執行效率。
但如今的編譯系統可以自動識別使用頻繁的變數,並將其放入到暫存器當中,所以只需要了解即可。
4. 用extern宣告外部變數
(1)在乙個檔案內宣告全域性變數
如果外部變數不在開頭定義,其有效作用範圍只限定於定義位置到檔案終了位置。如果定義點之前的函式想要引用該全域性變數,則應該在引用之前用關鍵字extern對該變數作外部變數宣告。
eg:#include
using namespace std;
int max(int,int);
int main()
int a=15;b=17; //定義全域性變數a,b
int max(int x,int y)
(2).在多檔案的程式中宣告全域性變數(外部變數)
如果乙個程式包含兩個檔案,在兩個檔案中都要用到同乙個全域性變數num,不能在兩個檔案中都定義,否則在進行程式的連線時會出現「重複定義」的錯誤。正確做法是:在任乙個檔案定義外部變數num,而在另乙個檔案中對num做外部變數宣告。
5.用static宣告靜態外部變數
當希望外部變數只限於被本檔案使用時,而不能被其他檔案引用。這是可以在定義外部變數時加乙個static宣告。
摘抄於 譚浩強 c++程式設計(第三版)
static全域性 區域性變數,全域性變數及區域性變數
1 static變數和全域性變數都是分配在 靜態儲存區 2 static全域性變數 static區域性變數 全域性變數和區域性變數區別 他們都是分配在 靜態儲存區內,都是在程式開始的時候初始化的,他們的區別是作用域不同,static全域性變數作用域是在申明所在的檔案中,而全域性變數是全域性的,其他檔...
static 全域性變數 區域性變數 函式
c語言中使用靜態函式的好處 靜態函式會被自動分配在乙個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。關鍵字 static 譯成中文就是 靜態的 所以內部函式又稱靜態函式。但此處 static 的含義不是指儲存方式,而是指對函式的作用域僅侷限 於本檔案。使用內部函式的好...
static修飾全域性區域性變數函式
1.static修飾全域性變數 特點如下 1 儲存區 靜態儲存區靜態儲存區在整個程式執行期間都存在 2 作用域 全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。非靜態全域性 變數的作用域是整個源程式 多個原始檔可以共同使用 好處 1 不會被其他檔案所訪問,修改 2 其他...