變量從作用域角度觀察,可分爲全局變量和局部變量,而從變量存在時間來觀察則分爲靜態存儲方式和動態存儲方式。
內存中供用戶使用的存儲空間可分爲三部分:
程序區
靜態存儲區 :全局變量
動態存儲區:函數形式參數、函數中定義的沒有static關鍵字的聲明變量、函數調用時的現場保護和返回地址
C中的存儲類別分爲4種:
自動的、
靜態的、
寄存器、
外部的、
1.自動變量
在函數內部如果不專門聲明static(靜態)存儲類別,都是動態地分配存儲空間,數據存儲在動態存儲區中
int f(int a)
{
auto int b,c=3;//等價於int b,c=3;
}
2.靜態局部變量(static 局部變量)
我們在函數內部定義的變量都是動態的,當函數執行完畢之後就會被系統回收掉,但有時根據需求,某個變量的值不能被回收,這裏有需要加入static局部變量,加上之後這個變量直到程序結束後纔會被釋放掉,這種形式在就是階乘時經常用到。
int fac(int n);
int i;
for (i=1; i<=5; i++) {
printf("%d!=%d\n",i,fac(i));
}
int fac(int n)
{
static int f=1;
f=f*n;
return (f);
}
3.寄存器變量(register)
在過去機器運算低下的情況下,爲提高運算效率允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器中去取,不必再到內存中去取。對寄存器的存取速度遠高於對內存的存取速度,這種變量叫做寄存器變量。現在一般都比怎麼用。
4.全局變量
全局變量的生命週期是到程序結束,但作用範圍卻根據在哪裏申請而受到限制,主要分爲兩種情況:
在一個文件內
int main(int argc, const char * argv[]) { extern A; printf("%d",A); return 0; } int A=10;
我們在main函數下邊申請了一個變量A,按照從上到下的順序,我們不能夠在main函數裏面調用變量A,但引入extern關鍵字我們就可以實現。
在兩個文件間
file1文件
int A=10; int main() { print(); return 0; }
file2文件
extern A; int print() { int print=A; return (A); }
倘若我們不想讓別的文件引入我們的變量我們可以在變量前面加上static,這樣就不會出現兩個文件間進行互用一個變量了。
我們對static做個總結:
(1)對局部變量用static聲明,是爲了把它分配在靜態存儲區,程序執行過程中分配的空間不釋放,
(2)對於全局變量用static聲明,作用是讓變量作用域只限於本文件模塊中