C語言常量以及變數型別,儲存型別和作用域
阿新 • • 發佈:2019-01-01
變數
其值可以改變的量稱為變數。一個變數應該有一個名字,在記憶體中佔據一定的儲存單元。變數定義必須放在變數使用之前。一般放在函式體的開頭部分。要區分變數名和變數值是兩個不同的概念。 變數定義的一般形式為:型別說明符 變數名, 變數名, ...;
在書寫變數定義時,應注意以下幾點:
- 允許在一個型別說明符後,定義多個相同型別的變數。各變數名之間用逗號間隔。型別說明符與變數名之間至少用一個空格間隔。
- 最後一個變數名之後必須以“;”號結尾。
- 變數定義必須放在變數使用之前。一般放在函式體的開頭部分。
變數定義舉例:
- int num,total;
- double price = 123.123;
- char
變數的賦值
變數可以先定義再賦值,也可以在定義的同時進行賦值;在定義變數的同時賦初值稱為初始化。在變數定義中賦初值的一般形式為:
型別說明符 變數1= 值1, 變數2= 值2, ……;
例如:
- int a=3;
- int b,c=5;
- float x=3.2,y=3.0,z=0.75;
- char ch1='K',ch2='P';
注意,在定義中不允許連續賦值,如a=b=c=5是不合法的。
區域性變數
定義在函式內部的變數稱為區域性變數(Local Variable),它的作用域僅限於函式內部, 離開該函式後就是無效的,再使用就會報錯。例如:- int f1
- int b,c; //a,b,c僅在函式f1()內有效
- return a+b+c;
- }
- int main(){
- int m,n; //m,n僅在函式main()內有效
- return 0;
- }
1) 在 main 函式中定義的變數也是區域性變數,只能在 main 函式中使用;同時,main 函式中也不能使用其它函式中定義的變數。main 函式也是一個函式,與其它函式地位平等。
2) 形參變數、在函式體內定義的變數都是區域性變數。實參給形參傳值的過程也就是給區域性變數賦值的過程。
3) 可以在不同的函式中使用相同的變數名,它們表示不同的資料,分配不同的記憶體,互不干擾,也不會發生混淆。
4) 在語句塊中也可定義變數,它的作用域只限於當前語句塊。
全域性變數
在所有函式外部定義的變數稱為全域性變數(Global Variable),它的作用域預設是整個程式,也就是所有的原始檔,包括 .c 和 .h 檔案。例如:- int a, b; //全域性變數
- void func1(){
- //TODO:
- }
- float x,y; //全域性變數
- int func2(){
- //TODO:
- }
- int main(){
- //TODO:
- return 0;
- }
區域性變數和全域性變數的綜合示例
【示例1】輸出變數的值:- #include <stdio.h>
- int n = 10; //全域性變數
- void func1(){
- int n = 20; //區域性變數
- printf("func1 n: %d\n", n);
- }
- void func2(int n){
- printf("func2 n: %d\n", n);
- }
- void func3(){
- printf("func3 n: %d\n", n);
- }
- int main(){
- int n = 30; //區域性變數
- func1();
- func2(n);
- func3();
- //程式碼塊由{}包圍
- {
- int n = 40; //區域性變數
- printf("block n: %d\n", n);
- }
- printf("main n: %d\n", n);
- return 0;
- }
func1 n: 20
func2 n: 30
func3 n: 10
block n: 40
main n: 30
程式碼中雖然定義了多個同名變數 n,但它們的作用域不同,在記憶體中的位置(地址)也不同,所以是相互獨立的變數,互不影響,不會產生
重複定義(Redefinition)
錯誤。1) 對於 func1(),輸出結果為 20,顯然使用的是函式內部的 n,而不是外部的 n;func2() 也是相同的情況。
當全域性變數和區域性變數同名時,在區域性範圍內全域性變數被“遮蔽”,不再起作用。或者說,變數的使用遵循就近原則,如果在當前作用域中存在同名變數,就不會向更大的作用域中去尋找變數。
2) func3() 輸出 10,使用的是全域性變數,因為在 func3() 函式中不存在區域性變數 n,所以編譯器只能到函式外部,也就是全域性作用域中去尋找變數 n。
3) 由
{
}
包圍的程式碼塊也擁有獨立的作用域,printf() 使用它自己內部的變數 n,輸出 40。3) C語言規定,只能從小的作用域向大的作用域中去尋找變數,而不能反過來,使用更小的作用域中的變數。對於 main() 函式,即使程式碼塊中的 n 離輸出語句更近,但它仍然會使用 main() 函式開頭定義的 n,所以輸出結果是 30。