C語言變數的作用域
C語言變數的作用域
變數是相對於常量而言的,代表了記憶體中具有特定屬性的一個儲存單元,程式執行期間其值可以改變。
1.基礎知識
資料型別:這個不必多說,就是為了確定變數所佔記憶體的大小,如int型佔一個字。
作用域:當存在多個檔案和函式時,變數在哪個檔案的函式中可以被使用。
存在期:變數在程式執行後存在(佔據儲存區)的時間段,如始終存在,本檔案記憶體在,本函式被呼叫的時候存在。
變數定義時可以字首以下關鍵字,表示特定屬性。
auto: 自動變數,變數定義時無字首,則預設為自動變數;
static:靜態變數;
register:暫存器變數,變數儲存於暫存器中,現已基本不用;
extern
**
2.總體認知
**
按照作用域和存在期劃分,變數分為自動變數、暫存器變數、靜態區域性變數、靜態全域性變數、全域性變數。其總體特性如下表。
3.具體解釋
3.1區域性變數
- 區域性變數包括自動變數、靜態區域性變數、暫存器變數;
- 區域性變數在本函式體內定義,存在於本函式體內;
- 不同函式內,區域性變數可以同名;
- 函式形參也是區域性變數;
- 在函式體內的符合語句中可定義區域性變數,且只存在和作用於該語句中;
3.1.1自動變數
自動變數是區域性變數的一種。
定義方式:
函式內定義:
void xxx(void)
{
auto+資料型別+變數名稱+;
auto int A=0;
char A=0;
}//這裡形參和複合語句的區域性自動變數的定義不再舉例說明;
變數定義時無字首,則預設為自動變數
作用域: 在本函式內可以呼叫;
存在期:在函式內定義,數值可變,存在於函式執行始終,伴隨函式開始而存在,結束而消亡。
3.1.2靜態區域性變數
靜態區域性變數是區域性變數的一種,在函式內定義和使用,存在於函式體外,編譯時一次賦值終身不變。
定義方式:
void xxx(void) { static+資料型別+變數名稱+; static int A=10; static int B; }
在函式體內定義,定義時未賦予初始數值或者字元,則預設為0或者空字元
作用域:在本函式內可以呼叫;
存在期:在函式內定義,數值不變,在程式編譯時存在,並且始終存在,直到程式執行結束,不以函式的執行與否而產生和消亡。
3.2全域性變數
全域性變數也稱外部變數和全程變數,定義後始終存在於整個程式,作用於宣告處。
3.2.1全域性變數(非靜態)
可以理解為auto 關鍵字預設;
定義方式:
1、當只有一個檔案的時候
資料型別+變數名稱;
int A=0; //全域性變數A從此處,存在和作用於向下的全部程式。
void xxx(void)
{
……
}
char B=’c’; //全域性變數b從此處,存在和作用於向下的全部程式。
void xxxx(void)
{
……
}
2、當有多個檔案的時候
//////////////////////////////////////<xxx1.c>/////////////////////////////////
int A=0; // 全域性變數A在此處作用於向下的整個檔案。
//全域性變數A在程式編譯的時候就存在於整個程式,本檔案可以使用。
void xx(void)
{……}
//////////////////////////////////////<xxx2.c>/////////////////////////////////
void xxx(void)
//全域性變數A在程式編譯的時候就存在於整個程式,本檔案可以使用。
{……}
extern A //全域性變數A在xxx2.c檔案的此處作用於向下的整個檔案
void xxxxx(void)
{……}
/////////////////////////////////////////////////////////////////////////////////
3.2.2靜態全域性變數
利用關鍵字static宣告。編譯時一次賦值終身不變。主要用於多檔案時,對它檔案遮蔽該變數。
//////////////////////////////////////<xxx1.c>/////////////////////////////////
static int A=0; // 靜態全域性變數A在此處作用於向下的整個檔案。
//靜態全域性變數A在程式編譯的時候就存在於整個程式,本檔案可以使用。
void xx(void)
{……}
//////////////////////////////////////<xxx2.c>/////////////////////////////////
void xxx(void)
//全域性變數A在程式編譯的時候就存在於整個程式,除了定義該靜態全域性變數的檔案外,他檔案無法使用。
{……}
extern A *erro
//除了定義該靜態全域性變數的檔案外,靜態全域性變數A無法被他檔案使用;
void xxxxx(void)
{……}
/////////////////////////////////////////////////////////////////////////////////
4.提高知識點
4.1變數的定義和宣告
圖4.1
定義一定是宣告,宣告不一定是定義;
定義在於確立儲存空間,宣告在於擴充套件作用域;
全域性變數可以一次定義,多處宣告,即將其作用域擴充套件至多處;
4.2變數的儲存區
圖4.2
記憶體一般劃分為,程式區、靜態儲存區、動態儲存區;
動態儲存區儲存:
1、形參
2、區域性自動變數
靜態儲存區儲存:
1、全域性變數(包含靜態和非靜態區域性變數)
2、static區域性變數