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