1。 extern, 從其英文意思外部的就能看出,這個表示引用一個外部變量。。
C語言程式編譯時是以每個.c 檔案為機關的,最後再把它們連結在一起,是以每個檔案中的全局變量對于其他檔案是可見的,是以可以在一個檔案中引用其他檔案中的變量和函數。
extern 關鍵字就是用來表示引用别的單元的變量。。。
比如。。file1.c 中
int main()
{
extern int c ; //引用外部變量。。。
exten int sum(int a, int b);
scanf("%d",&c);
printf("%d ",c);
}
在 file2.c中
int c ;
====================================================================================
是以 file1.c可以用其他變量。。
如果 file2.c 中并沒有定義變量c ,那麼此用法将是錯誤的。。
同理,函數也可以用此方式。。
如果外部檔案中的全局變量定義為 static ,則也不能extern操作。
2 。。 static
上文提到了static
static 有兩重功能, 第一是修飾全局變量,和函數,這樣的效果是其他檔案不能引用static修飾了的變量和函數。
比如:
file1.c
int main()
{
extern int a ; // 引用錯誤
extern int sum(int ,int ) // 錯誤。。
.....
}
file2.c
static int a;
static int sum(int a, int b);
是以。。
static 的第一個功能是當其修飾全部變量和函數時,能限定變量和函數的作用域在此檔案,而不被其他檔案所見。
第二。 當static 修飾局部變量時。。
衆所周知,函數中局部變量是自動配置設定在棧中的,當函數結束時會自動銷毀棧中的資料。。
如果用static 修飾時:
int fun( )
{
static int count = 0;
return count ++;
}
int main()
{
int i;
for (i = 0; i<10 ; i++)
fun();
}
由于 fun()中的 count 為static修飾。 是以它被配置設定在記憶體中的靜态存儲區, 而不是棧中, 是以它的生命周期伴随着整個程式而不是函數,它不會随着函數的結束而銷毀, 但是在函數外部也不能引用它,隻能在每次進入函數後操作。
每次for 循環時,count 會 自加1 。。。
靜态局部變量隻初始化一次,如果沒有初始化,那麼會自動初始化為0 。。
因為記憶體中的靜态存儲區會被自動初始化為 0;
是以可以 static char str[100] ;
這時str 被初始化為0,而不用去手動初始化,這也是一種方法。。
static 和 auto 變量是不同的。
3 。 auto 變量
C語言中預設的資料存儲類型都是auto 變量,即自由變量,它在定義的位置被自動任意配置設定到記憶體中 ,是以當到它的作用域之外時,會自動被OS 銷毀。。
注意: 全部變量不是auto 型,它是在靜态存儲區的。。
一個變量不能同時用 static 和 auto 修飾,比如 static auto int a ;
這樣定義是互相沖突的。。
是以 對于 auto 變量, 必須在使用時初始化, 或者賦給值,否則它的值是無效值。
4 register
rigister 為寄存器變量, 由于某些資料CPU 要經常讀取,為了讀取快捷,編譯器會把這些資料放寄存器中,而不放在記憶體中,這樣CPU 便可以直接從其寄存器中讀取資料。。
但是 寄存器的數量畢竟有限,并不是所有定義的register變量都存儲在寄存器中 。。
register 變量的資料類型必須符合cpu寄存器支援的資料類型 ,一般為整型和浮點型,現在的CPU寄存器也基本支援浮點型。
register 變量的資料長度必須小于等于寄存器所支援的最大資料長度。
register 變量有可能沒有存儲在記憶體中, 是以不要用& 取其位址。
現在的CPU 速度已足夠運算了,是以register變量已經過時了 ,盡量不用。