關於全域性變數與區域性變數的基礎性的東西是c中的乙個重點,本節將重點討論區域性變數、全域性變數、static區域性變數、static全域性變數等多種變數型別及其使用。
1:何為區域性變數與全域性變數?
區域性變數:在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只在本函式內才能使用。
說明:main函式中的變數也只能在main函式中有效,main函式不能使用其他函式中定義的變數。
另外:在乙個函式內部,可以在復合語句中定義變數,這些變數只在復合語句中有效。如:
void main()..
.}
全域性變數:程式的編譯單位是源程式檔案,乙個原始檔可以包含乙個或若干個函式,在函式內定義的變數是區域性變數,而在函式外定義的變數稱之為外部變數,外部變數是全域性變數。全域性變數可以為本檔案中其他函式所用,有效範圍從定義變數的位置開始到本原始檔結束。
要求:在c程式設計中,有個不成文的規定:要將全域性變數名的第乙個字母大寫表示
2:全域性變數與區域性變數是否可以重名?
可以,如果在同乙個原始檔中,外部變數與區域性變數同名,則在區域性變數的作用範圍內,外部變數被「遮蔽」,即它不起作用。
3:**變數的儲存類別
關於變數值的儲存,在說棧區與堆區區別的時候也有提到:
當時就提到了不同的變數值存放在不同的區域,裡面的全域性變數區也可以稱之為靜態區,而棧區與堆區都是動態分配的,所以也叫做動態區。因此在變數值儲存的角度來說又可以分為:靜態儲存方式和動態儲存方式。具體的又分為:
(1)自動的(auto)
(2)靜態的(static)
(3)暫存器的(register) (
4)外部的(extern)
儲存分類:
靜態儲存區:全部的全域性變數
動態儲存區:
(1)函式的形式引數
(2)自動變數(未加static宣告的區域性變數)
(3)函式呼叫時的現場保護和返回位址
4:深入淺出變數型別
區域性變數:
(1)auto變數
函式中的區域性變數,如果不專門宣告為static儲存類別,都是動態地分配儲存空間,資料儲存在動態儲存區中。
如:函式中的形參和在函式中定義的變數
關鍵字「auto」可以省略,auto不寫則隱含的確定為「自從儲存類別」,他屬於動態儲存方式。程式中大多屬於此型別。
(2)static宣告區域性變數
有時候希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即其占用的儲存單元不釋放,在下一次該函式呼叫時,該變數已有值,就是上一次 函式呼叫結束時的值。這時就應該指定該區域性變數為「靜態區域性變數」,用static宣告。
如下圖例子所示:
問題一:普通區域性變數和static區域性變數有什麼區別?
(1)靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配記憶體儲存單元。在程式整個執行期間都不釋放。而自動變數屬於動態儲存類別,佔動態儲存空間而不佔靜態儲存空間。
(2)static區域性變數只初始化一次,下一次依據上一次的結果值。
全域性變數:
問題二:如何引用乙個已經定義了的全域性變數?(乙個檔案的程式)
問題延伸:如果外部變數不在檔案開頭定義,其有效的作用範圍只限於定義處到檔案結束。如果在定義前的函式想引用該外部變數。如何引用?
分析:使用關鍵字extern對該變數做「外部變數宣告」,表示該變數是乙個已經定義的外部變數。有了此宣告,可以從「宣告」處起,合法的使用該外部變數。
e.g.1:
#include void main()
int a=13,b=-18;
int max(int x,int y)
問題三:上述介紹中,是在乙個檔案中可以用extern來宣告乙個全域性變數,那如果是在多個檔案中都要使用該變數,如何解決?
分析:比如說兩個檔案中都使用了乙個外部變數num,不能分別在兩個檔案中各自定義乙個外部變數,否則在警醒程式的連線時會出現「重複定義」的錯誤。
正確的做法是:在任何乙個檔案中定義外部變數num,在另乙個檔案中用extern對num做「外部變數宣告」。
/****file1.c****/
int a;
void main()
/***file2.c****/
extern a;
int power(int n)
問題四:系統如何處理extern帶來的作用域擴充套件?
分析:在編譯時遇到extern時,先在本檔案中找到外部變數的定義,如果找到,就在本檔案中擴充套件作用域;如果找不到,就在連線時從其他檔案中找到外部變數的定義。如果從其他檔案中找到,就將作用域擴充套件到本檔案;如果找不到就按出錯處理。
問題五:程式設計中希望某些外部變數只限於本檔案引用,而不能被其他檔案引用。如何處理?
static變數
針對這個問題:可以用static變數來宣告。
/****file1.c****/
static int a;
void main()
/*****file2*****/
extern int a;
void fun(int n)
在file1.c中定義了乙個static的全域性變數,因此只適用於本檔案,雖然file2.c檔案中用了extern int a,但file2.c中無法適用file1.c中的全域性變數。
問題六:static全域性變數和普通全域性變數有什麼區別?
static全部變數只初始化一次,防止被其他檔案使用。
問題七:全域性變數可以不可以被多個.c檔案包含的標頭檔案中?為什麼?
可以,可以在不同的檔案用宣告static全域性變數,但是只能在某乙個檔案中初始化一次。否則會出錯。
暫存器變數
一般情況下,變數(包括靜態儲存方式和動態儲存方式)的值都存放在記憶體中。當程式中用到哪乙個變數的值時,由控制器發出指令將記憶體中該變數的值送到運算器。經過運算器進行運算,如果需要存數,再從運算器 將資料送到記憶體存放。
如果有一些變數使用頻繁,則為訪問變數的值花費不少時間。為提高執行效率,c語言允許將區域性變數的值存放在cpu中的暫存器中,需要時直接從暫存器去處運算,不必再到記憶體中訪問。這樣的變數用register宣告。
問題:哪些變數可以作為暫存器變數?
(1)只有區域性自動變數和形式引數可以作為暫存器變數,其他的不行。在呼叫乙個函式時占用一些暫存器變數以存放暫存器變數的值,函式呼叫結束釋放。
(2)乙個計算機系統中的暫存器數目有限,不能同時定義任意多個暫存器變數,不同的系統允許的暫存器變數個數也不同。
(3)區域性靜態變數不能定義為暫存器變數。
c c 全域性變數與區域性變數
在c c 中變數是最基本的成員,也是我們最常用的東西,變數大體上分為全域性變數與區域性變數兩種,全域性變數是在整個程式中都可以使用,而區域性變數只能在最接近定義它的一組大括號內使用,總的來說,在c c 裡面,變數只有定義了並在其生命週期內才能使用。說得有點抽象,給大家看個例子吧。a 全域性變數 in...
區域性與全域性變數
區域性變數和全域性變數 一.區域性變數 1 在乙個函式內部定義的變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的。include using namespace std float add float x,float y intmain 2 形參屬於...
區域性變數與全域性變數
根據c語言的說法,區域性變數 定義在方法內部的變數叫區域性變數 全域性變數 定義在方法外部的變數叫全域性變數。區域性變數和全域性變數的主要區別在於二者的生存週期不同。全域性變數的生存週期 靜態分配記憶體,程式執行期間常駐記憶體,直到程式執行結束。區域性變數的生存週期 動態分配記憶體,位於執行緒堆疊中...