存儲(chǔ)類(lèi)、鏈接和內(nèi)存管理
1.作用域
作用域描述了程序中可以訪問(wèn)一個(gè)標(biāo)識(shí)符的一個(gè)或多個(gè)區(qū)域。
一個(gè)C變量的作用域可以是代碼塊作用域、函數(shù)原型作用域或者文件作用域。
代碼塊作用域
一個(gè)代碼塊是包含在開(kāi)始花括號(hào)和對(duì)應(yīng)的結(jié)束花括號(hào)之內(nèi)的一段代碼。
例如,整個(gè)函數(shù)體是一個(gè)代碼塊。
一個(gè)函數(shù)內(nèi)的任一復(fù)合語(yǔ)句也是代碼塊。
在代碼快中定義的變量具有代碼塊作用域(block scope),從該變量被定義的地方到包含該定義的代碼塊的末尾該變量均可見(jiàn)
。
另外,函數(shù)的形式參數(shù)盡管在函數(shù)的開(kāi)始花括號(hào)前進(jìn)行定義,也同樣具有代碼塊作用域,并且屬于包含函數(shù)體的代碼塊。
{
double patrick = 0.0;
return patrick;
}
在上面這個(gè)例子中,cleo和patrick都有知道結(jié)束花括號(hào)的代碼作用域。
在一個(gè)內(nèi)部代碼塊中聲明的變量,其作用域只局限于該代碼塊:
{
double patrick = 0.0;
int i;
for (i=0; i < 10; i++)
{
double q = cleo * i; // q作用域的開(kāi)始
……
patrick *= q;
}//q作用域的結(jié)束
return patrick;
}
在這個(gè)例子中,q的作用域被限制在內(nèi)部代碼塊內(nèi),只有該代碼內(nèi)的代碼可以訪問(wèn)q。
C99允許在一個(gè)代碼塊中的任何位置聲明變量,使用之前請(qǐng)注意編譯器能不能支持。
如,你可以這樣聲明
{
printf ("A C99 feature: i=%d", i);
}
2.函數(shù)原型作用域
從變量定義處一直到原型聲明的末尾,這意味著編譯器在處理一個(gè)函數(shù)原型的參數(shù)時(shí),它所關(guān)心的只是該參數(shù)的類(lèi)型;您使
用的名字是無(wú)關(guān)緊要的。
3.文件作用域
一個(gè)在所有函數(shù)之外定義的變量具有文件作用域 (file scope)。
具有文件作用域的便狼從它定義處到包含該定義的文件結(jié)尾處都是可見(jiàn)的。
int units = 0;//具有文件作用域的變量
void critic (void);
int main (void)
{
……
}
void critic (void)
{
……
}
這里,變量units具有文件作用域,在main ()和critic ()中都可以使用它。因?yàn)樗鼈兛梢栽诓恢挂粋€(gè)函數(shù)中使用,文件作用域變量也被稱(chēng)為全局變量(global varibale)。
4.goto
函數(shù)作用域只適用于goto語(yǔ)句使用的標(biāo)簽。函數(shù)作用域意味著一個(gè)特定函數(shù)中的goto標(biāo)簽對(duì)該函數(shù)中任何地方的代碼都是可見(jiàn)的,無(wú)論該標(biāo)簽出現(xiàn)在哪一個(gè)代碼塊中。