變數的儲存類別
阿新 • • 發佈:2018-11-26
- 儲存類別:是指資料在記憶體中的儲存方式
(1)供使用者使用的儲存空間:
程式區
靜態儲存區:編譯時候分配空間,程式結束釋放空間。(存放全域性變數)
動態儲存區:定義時動態分配空間,對應函式完成時就釋放空間,再呼叫時又重新動態分配空間。(存放auto型別區域性變數)
(2)儲存型別:auto,static,register,extern
(3)變數的完整定義:儲存型別,資料型別,變數名 - 自動變數(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)格式: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
- 暫存器變數:
格式:register 資料型別 變數名[=初始化表示式]
說明:只有區域性自動變數和形參可以作為暫存器變數,其他變數不行;
一個計算機系統中的暫存器數目是有限的,不能定義任意多個暫存器變數;
不同的計算機系統對register變數的處理是不同的;
區域性變數不能定義為暫存器變數。 - 用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';
}
- 用static宣告外部變數
作用:只允許本檔案中的函式引用的靜態變數稱為靜態外部變數。
注:對外部變數加或不加static說明都是靜態儲存方式,只是作用範圍不同而已。 - 儲存類別小結
對一個數據的定義,需要指出兩種屬性:資料型別和儲存型別,分別用兩個關鍵字定義。