1. 程式人生 > >C語言變數的作用域

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區域性變數