1. 程式人生 > >變數的儲存類別

變數的儲存類別

  1. 儲存類別:是指資料在記憶體中的儲存方式
    (1)供使用者使用的儲存空間:
    程式區
    靜態儲存區:編譯時候分配空間,程式結束釋放空間。(存放全域性變數)
    動態儲存區:定義時動態分配空間,對應函式完成時就釋放空間,再呼叫時又重新動態分配空間。(存放auto型別區域性變數)
    (2)儲存型別:auto,static,register,extern
    (3)變數的完整定義:儲存型別,資料型別,變數名
  2. 自動變數(auto):
    (1)格式:
    [auto]資料型別 變數名[=初始化表示式]
    注:自動變數是動態分配儲存空間,區域性變數預設為auto型別
    (2)說明:
    未進行初始化時,自動變數的值是不定的;
    引用自動變數,必須對其初始化或對其賦值;
    對同一函式的兩次呼叫之間,自動變數的值是不保留的;
    自動變數的初始化是在函式呼叫時進行的;
    函式的形參也是一種自動變數。
    (3)例:(說明動態分配儲存空間情況)
main()
{int i;
  void count();
  for(i=1;i<=3;i++)
  		count(i);
}
void count(int n)
{int x;
  printf("%d:x=%d",n,x);
  x=x+2;
  printf("x+2=%d\n",x);
}
//執行結果:
1:x=1,x+2=3
2:x=2,x+2=4
3:x=3,x+2=5
  1. 靜態區域性變數:
    (1)格式:static 資料型別 變數名[=初始化表示式]
    注:自動變數是靜態分配儲存空間
    (2)說明:
    靜態變數的儲存空間在程式的整個執行期間是固定的,而不像動態變數是在程式執行中被建立,動態撤銷的;
    靜態變數的初始化是在編譯時進行的;
    靜態區域性變數的值具有可繼承性;
    靜態區域性變數的值只能在本函式中使用;
    C規定,只能在定義全域性變數和區域性靜態變數時才能對陣列初始化為0。
    注:什麼情況下使用區域性靜態變數呢?
    答:需要保留函式上一次呼叫結束時的值;如果初始化後,變數只被引用而不改變其值則可用;函式中的陣列要初始化時。
    (3)例:(分別使用自動變數和靜態變數比較程式)
main()
{int i;
  void count();
  for(i=1;i<=3;i++)
  		count(i);
}
void count(int n)
{int x=1;
  static int y=1;
  printf("%d:x=%d,y=%d",n,x,y);
  x+=2;
  y+=2;
  printf("x+2=%d,y+2+%d\n",x,y);
}
//執行結果:
1:x=1,y=1,x+2=3,y+2=3
2:x=2,y=3,x+2=4,y+2=5
3:x=3,y=5,x+2=5,y+5=7
  1. 暫存器變數:
    格式:register 資料型別 變數名[=初始化表示式]
    說明:只有區域性自動變數和形參可以作為暫存器變數,其他變數不行;
    一個計算機系統中的暫存器數目是有限的,不能定義任意多個暫存器變數;
    不同的計算機系統對register變數的處理是不同的;
    區域性變數不能定義為暫存器變數。
  2. 用extent宣告的外部變數:
    (1)在一個檔案內宣告外部變數
    作用:擴充套件外部變數的作用範圍
    (2)在多檔案程式中宣告外部變數(用工程檔案連線時)
    作用:允許其他檔案中的函式引用(這時需在引用它的檔案中用extern說明)
//file 1.c
int x,y;
char ch;
main()
{
	x=12;
	y=24;
	f1();
	printf("%c",ch);
}
//file2.c
extern int x,y;
extern char ch;
f1()
{
	printf("%d,%d\n",x,y);
	ch='a';
}
  1. 用static宣告外部變數
    作用:只允許本檔案中的函式引用的靜態變數稱為靜態外部變數。
    注:對外部變數加或不加static說明都是靜態儲存方式,只是作用範圍不同而已。
  2. 儲存類別小結
    對一個數據的定義,需要指出兩種屬性:資料型別和儲存型別,分別用兩個關鍵字定義。在這裡插入圖片描述