區域性變數、全域性變數的作用域與生存期
學習函式之前,我們所見到的程式,大多數是一個程式只包含一個main函式,變數是在函式開頭處定義。這些變數在本函式範圍內有效。在函式這一章見到的一些程式,包括兩個或多個函式,分別在各函式開頭定義變數。那麼不同函式的變數彼此之間能互相訪問嗎?
這就是變數的作用域問題,即定義變數後,變數在什麼範圍內有效。
變數定義位置可出現在三個地方:函式開頭、函數里面的複合語句內和函式外部。
一、區域性變數、全域性變數
按照作用域,變數分為區域性變數和全域性變數。在函式外定義為全域性變數,否則為區域性變數。
(一)區域性變數
區域性變數是在函式內部定義,區域性變數也可在複合語句內定義。複合語句是用大括號括起來的語句。
案例1 閱讀程式,理解區域性變數。
#include
int main()
{
int i=520;
printf(“before,i=%d\n”,i);
for(i=0;i<5;i++)
{
printf(“i=%d\n”,i);
}
{
int k=0;
k=i+10;
printf(“k=%d\n”,k);
}
printf(“after,i=%d\n”,i);
printf(“k=%d\n”,k);
return 0;
}
執行結果:
分析程式:
(1)在函式開頭定義變數i,因此變數i在整個函式內部有效。
(2)在複合語句(用大括號括起來的語句快)中定義變數k,所以變數k只在大括號內有效。若在函式末尾用語句printf(“k=%d\n”,k);出現變數k,執行除錯會出現語法錯誤,如圖:
注意:當複合語句中變數與函式內定義變數同名時,複合語句中變數自動遮蔽其他變數。可以這麼理解,同名人很多,人們習慣用這個名字專門指定他們最熟的這個人。
(二)全域性變數
函式之外定義的變數稱為外部變數,外部變數是全域性變數,也叫全程變數。全域性變數可以為本檔案和其他檔案共用。全域性變數的有效範圍從定義變數的位置開始到本原始檔結束。#
函式內部定義的變數為內部變數,外部定義則為全域性變數。函式區域性變數名與全域性變數名相同時,區域性變數遮蔽全域性變數,不受全部變數影響。
二、變數儲存方式和生存期
(一)動態儲存方式與靜態儲存方式
(二)區域性變數的儲存類別
1。自動變數(auto變數)
在前面學習中見到的程式中的變數均為自動變數,只是定義變數時,省略了關鍵字auto。
在呼叫該函式時,系統會給這些變數分配儲存空間,在函式呼叫結束時,自動釋放這些儲存空間。‘
函式中的區域性變數,若沒有特別說明,都是動態發的分配儲存空間的,資料儲存在動態儲存空間中。
2。靜態區域性變數(static區域性變數)
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而繼續保留原值,即其佔用的儲存單元不釋放,在下一次呼叫該函式時,該變數已有值。這時就可以指定該區域性變數為靜態區域性變數,用關鍵字static進行宣告。
案例:閱讀程式,理解靜態區域性變數的值變化
#include
void func();
void func()
{
static int count=0;
printf(“count=%d\n”,count);
count++;
}
int main()
{
int i;
for(i=0;i<5;i++)
{
func();
}
return 0;
}
執行結果:
程式分析:
(1)靜態變數count值每次執行後均被保持下來,此程式中實現了累加。例子#
3。暫存器變數(register變數)
暫存器儲存在CPU中的暫存器中,優先級別很高。自動變數儲存在動態儲存區,靜態區域性變數儲存在靜態儲存區。
(三)全域性變數的儲存類別
全域性變數都是存放在靜態儲存區中的。因此他的生存其實固定的,存在於程式的整個執行過程。但是對全域性變數來說,還有一個問題尚待解決,就是他的作用與究竟從什麼位置起,到什麼位置止。
用用於是包括整個檔案範圍還是檔案中的一部分範圍,是在一個檔案中有效還是在程式的所有檔案中都有效,這就需要指定不同的儲存類別。
1。在一個檔案內擴充套件全域性變數的作用域
這裡要用到關鍵字extern,用extern對全域性變數做外部變數宣告。
案例 閱讀程式,理解運用extern擴充套件全域性變數在程式檔案中的作用域
#include
void f1();
int main()
{
extern int count;
f1();
count++;
printf(“in main,count=%d\n”,count);
return 0;
}
int count;
void f1()
{
count++;
printf(“in f1,count=%d\n”,count);
}
執行結果:
可試一試,若把extern int count;中extern去掉,執行除錯會產生什麼結果。
程式分析:
(1)若沒有extern關鍵字說明時,因count不是在檔案開頭定義,他的作用域是從其定義處開始,到程式的末尾。
(2)當用extern對count變數做外部變數聲明後,表示把count變數的作用與擴充套件到此位置。有了此宣告,就可以從宣告處起,合法的使用該外部變量了。
例#
2。將外部變數的作用域擴充套件到其他檔案
如果程式由多個原始檔組成,那麼在一個檔案中想引用另一個檔案中已定義的外部變數,有什麼辦法呢?用關鍵字extern。
案例 閱讀程式,理解運用extern關鍵字,將外部變數的作用域擴充套件到其他檔案