第十二次課----全域性變數、區域性變數和儲存類別
一、作用域
1.檔案作用域
2.函式作用域
3.語句塊
demo1:
int main(void)
i = 10;//錯誤,i超出了它的作用域範圍
return 0;
}demo2:
int main(void)
i = 10;//錯誤,i超出了它的作用域範圍,
return 0;
}注意:
1>同乙個作用域中不能出現相同的識別符號(黑色單詞,如變數名,函式名)
demo:
void foo(int a)
void foo(void)//錯誤,foo重定義
2>函式作用域巢狀在檔案作用域內,語句塊作用域巢狀在函式作用域內。
demo:
//檔案作用域
void foo(void)//函式作用域
}3>判定識別符號屬於哪乙個作用域的原則是:就近原則
識別符號不能同時屬於兩種作用域!
demo
void foo(void)
printf("%d\n", i);
int foo = 10;
printf("%d", foo);//是函式名還是變數名??
}demo2分析下面變數的作用域
float f1(int a)
float f2(int x,int y)
int main()
4>
區域性變數:就是在函式作用域或者是語句塊作用域中定義的變數
全域性變數:就是在檔案作用域中定義的變數(實際開發中盡量不要使用全域性變數)
demo識別以下變數是區域性變數還是全域性變數
int g_a = 0;
void foo(void)
printf("%d\n", i);
int foo = 10;
printf("%d", foo);
}int foo = 0;//error
總結:作用域解決的是識別符號的使用範圍,是空間的問題
5>全域性變數和函式都屬於檔案作用域內的識別符號,檔案作用域內的識別符號是可以通過extern擴充套件作用域的!
demo1 指出下面程式的錯誤
int main(void)
void foo(void){}
int g_a = 0;
改進如下
extern void foo(void);
extern int g_a = 0;
int main(void)
void foo(void){}
int g_a = 0;
二、儲存類別
1.儲存類別解決的是識別符號的「生命週期」或者變數記憶體的開闢時間和銷毀時間
2.學習儲存類別時不要去考慮作用域,兩者沒有關係!
void foo(int a)
//a記憶體銷毀
int main(void)
注意:1>並非所有的變數都可以宣告為static,形式引數不能宣告為static,只能宣告 為auto.
void foo(static int a);//錯誤,形參a不能用static宣告
void foo(auto int a);//正確
2>變數宣告為static時,不賦初值時預設為0.
void foo(void)
int main(void)
3>全域性識別符號如果用static修飾,並不是表示在全域性區而是表示該識別符號只能在本檔案內被擴充套件使用。
demo1:
main.c:
extern int g_a;//正確
static int g_a;
fun.c
extern int g_a;//錯誤
demo2.
main.c:
extern void foo(void);//正確
static void foo(void){};
fun.c
extern void foo(void);//錯誤
C語言區域性變數和全域性變數
在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅對於形參變數,c語言中所有的量都有自己的作用域。變數說明的方式不同,其作用域也不同。c語言中的變數,按...
C語言區域性變數和全域性變數
在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅對於形參變數,c語言中所有的量都有自己的作用域。變數說明的方式不同,其作用域也不同。c語言中的變數,按...
C語言區域性變數和全域性變數
在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅對於形參變數,c語言中所有的量都有自己的作用域。變數說明的方式不同,其作用域也不同。c語言中的變數,按...