1. 程式人生 > >C語言中的生命週期,作用域,預設值,記憶體區域,連結屬性

C語言中的生命週期,作用域,預設值,記憶體區域,連結屬性

1、全域性變數:定義在函式外部的變數

  • 生命週期:從程式執行開始建立,程式退出銷燬;
  • 作用域:從定義該變數開始一直到檔案的結束;
  • 預設值:0;
  • 記憶體區域:全域性(靜態)變數區;
  • 連結屬性:外部(可以在其他檔案中引用)。

注意:全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。如果在兩個檔案中都定義了相同名字的全域性變數,連接出錯:變數重定義引用方法:其他檔案中要使用必須用extern 關鍵字宣告要引用的全域性變數。

//fine.cpp  
int g_h = 1;  
  
//main.cpp  
extern int g_h;  
  
int main()  
{  
    printf("%d",g_h);  
    return 0;  

}

2、靜態全域性變數:定義在函式外部,只在被定義的檔案中可見。

  • 生命週期:從程式執行開始建立,程式退出銷燬;
  • 作用域:作用域:從定義該變數開始一直到檔案的結束;
  • 預設值:0;
  • 記憶體區域:全域性(靜態)變數區;
  • 連結屬性:內部(只可以在本檔案中使用,不可以在其他檔案中引用)。

注意:只要檔案不互相包含,在兩個不同的檔案中是可以定義完全相同的兩個靜態變數的,它們是兩個完全不同的變數。定義方法:static關鍵字,const 關鍵字.

//max.cpp中定義靜態全域性變數
static int a=10;
//main.cpp 
extern int a//error

3、區域性變數:定義在函式內部的變數,包括形參,只在區域性作用域中可見

  • 生命週期:進入函式時建立,函式退出時銷燬;
  • 作用域:本函式內部有效;
  • 預設值:隨機值;
  • 記憶體區域:棧;
  • 連結屬性:無。
# include<stdio.h> 
void Fun()  
{  
    int a = 0;//區域性變數 
	a++;  
	printf("%d\n",a);  
}  
	  
int main()  
{  
	for(int i=0;i<10;i++)  
	{  
	    Fun();  	   
    }  
	return 0;  
} 

結果為:


4、靜態區域性變數:定義在函式內部的變數,包括形參,

  • 生命週期:第一次進入函式時建立,程式結束時銷燬;
  •  作用域:本函式內部;
  • 記憶體區域:全域性(靜態)變數區;
  • 預設值:0;
  • 連結屬性:無。
注意:只被初始化一次,定義時加上static
# include<stdio.h> 
void Fun()  
{  
    static int a = 0;  //靜態區域性變數,第一次進入才執行
	a++;  
	printf("%d\n",a);  
}  
	  
int main()  
{  
	for(int i=0;i<10;i++)  
	{  
	    Fun();  	   
    }  
	return 0;  
} 

結果:

5、動態記憶體

  • 生命週期:呼叫動態記憶體建立函式時才建立,呼叫動態記憶體釋放函式時銷燬;
  • 作用域:建立成功後沒有釋放時只要獲得動態記憶體就有地址;
  • 預設值:無;
  • 記憶體區域:堆(記憶體洩漏);
  • 連結屬性:無。

6、函式:外部函式,內部函式(加上static)

  • 記憶體區域:程式碼段;
  • 連結屬性:有static 內部,無static 外部。
//max.cpp存放函式的實現
static int g_h = 100;//連結屬性為內部,內部符號

int Max(int a,int b)//對外的函式,外部函式
{
	return a>b ? a : b;
}

static int Min(int a,int b)//對內的函式,內部函式,本檔案可以使用,其它檔案不能使用
{
	return a<b ? a : b;
}
//max.h對外的函式宣告
int Max( int a,intb);

 在主函式頁新增# include <max.h>標頭檔案便可使用Max函式,若想使用Min函式必須用extern宣告Min函式 :extern int Min(int,int ); 若在Min函式前新增static即使使用extern 宣告Min函式也無法使用Min函式