標籤:str static 變數聲明 儲存 靜態 處理 標識符 部分 建立
範圍
當變數在程式的某個部分被聲明的時候,他只有在程式的一定漁區才能被訪問,編譯器可以確認4種不同類型的範圍:檔案範圍,函數範圍,代碼塊範圍和原型範圍
1.代碼塊範圍:位於一對花括弧之間的所有語句稱為一個代碼塊.任何在代碼塊的開始位置聲明的標識符都具有代碼塊範圍,表示他可以被這個代碼塊中的所有語句訪問.(例子中:f,g函數,i)
2.檔案範圍:任何在所有代碼塊之外聲明的標識符都具有檔案範圍,他表示這些標識符從他們的聲明之處直到他所在的源檔案結尾處都是可以訪問的.(例子中:a,b)
3.原型範圍:原型範圍只適用於在函數原型中聲明的參數名.(例子中:c,h)
4.函數範圍:表示一個函數中的範圍.
例子:
int a;
int b(int c);
int d (int e){
int f:
int g(int h);
...
{
int f,g,i;
}
{
int i;
}
}
連結屬性
當組成一個程式的各個源檔案分別被編譯之後,所有的目標檔案以及那些從一個或者多個函數庫中引用的函數連結在一起,形成可執行程式,如果相同的標識符出現在幾個不同的源檔案中.標識符的連結屬性決定如何處理這些標識符.
連結屬性一共有三種:external(外部),internal(內部)和none(無).
1.none:沒有連結屬性的標識符(none)總是被當做單獨的個體.
2.internal:標識符在同一個源檔案內的所有聲明都指同一個實體,但位於不同源檔案的多個聲明則分屬於不同實體
3.external:標識符不論聲明多少次,位於幾個源檔案都表示同一個實體.
例子:
typedef char *a;
int b;
int c(int d){
int e;
int f(int g);
}
預設情況下:b,c,f的連結屬性為external,其餘標識符為none.
關鍵字extern和static用於在聲明中修改標識符的連結屬性.如果在預設是external屬性前加上static,可以使他的屬性變為internal.
比如上述 static int b;和static int c(int d)就變成這個源檔案私人,不能被其他檔案訪問.
static只對預設屬性為external的聲明才有效果,對預設是none的效果完全不一樣.
extern可以吧none屬性的標識符變為external屬性.
比如上述extern int e修改之後可以使用其他源檔案的e標識符
儲存類型
在程式中,變數儲存類型決定他何時建立,何時銷毀,以及他的值保持多久.有三個地方可以用於儲存變數:普通記憶體,運行時堆棧,硬體寄存器.
普通記憶體:凡是在任何代碼塊之外聲明的變數總是儲存於靜態記憶體中.這類變數稱為靜態變數,這類變數在程式啟動時建立,終止時銷毀.
運行時堆棧:在代碼塊內部聲明的變數的預設儲存類型是自動的,稱為自動變數.如果在代碼塊內部聲明的變數前面加上static,這個變數的儲存類型就改變為靜態,程式運行中一直存在
硬體寄存器:使用關鍵字register聲明的變數表示寄存器變數,儲存在硬體的寄存器中.他只能對自動變數聲明
C語言中的範圍,連結屬性和儲存類型