1. 程式人生 > >C語言常量以及變數型別,儲存型別和作用域

C語言常量以及變數型別,儲存型別和作用域

變數

其值可以改變的量稱為變數。一個變數應該有一個名字,在記憶體中佔據一定的儲存單元。變數定義必須放在變數使用之前。一般放在函式體的開頭部分。要區分變數名和變數值是兩個不同的概念。 C語言變數 變數定義的一般形式為:
    型別說明符  變數名, 變數名, ...;

在書寫變數定義時,應注意以下幾點:
  • 允許在一個型別說明符後,定義多個相同型別的變數。各變數名之間用逗號間隔。型別說明符與變數名之間至少用一個空格間隔。
  • 最後一個變數名之後必須以“;”號結尾。
  • 變數定義必須放在變數使用之前。一般放在函式體的開頭部分。

變數定義舉例:
  1. int num,total;
  2. double price = 123.123;
  3. char
    a = 'a', abc;

變數的賦值

變數可以先定義再賦值,也可以在定義的同時進行賦值;在定義變數的同時賦初值稱為初始化。

在變數定義中賦初值的一般形式為:
    型別說明符 變數1= 值1, 變數2= 值2, ……;

例如:
  1. int a=3;
  2. int b,c=5;
  3. float x=3.2,y=3.0,z=0.75;
  4. char ch1='K',ch2='P';

注意,在定義中不允許連續賦值,如a=b=c=5是不合法的。

區域性變數

定義在函式內部的變數稱為區域性變數(Local Variable,它的作用域僅限於函式內部, 離開該函式後就是無效的,再使用就會報錯。例如:
  1. int f1
    (int a){
  2. int b,c; //a,b,c僅在函式f1()內有效
  3. return a+b+c;
  4. }
  5. int main(){
  6. int m,n; //m,n僅在函式main()內有效
  7. return 0;
  8. }
幾點說明:
1) 在 main 函式中定義的變數也是區域性變數,只能在 main 函式中使用;同時,main 函式中也不能使用其它函式中定義的變數。main 函式也是一個函式,與其它函式地位平等。

2) 形參變數、在函式體內定義的變數都是區域性變數。實參給形參傳值的過程也就是給區域性變數賦值的過程。

3) 可以在不同的函式中使用相同的變數名,它們表示不同的資料,分配不同的記憶體,互不干擾,也不會發生混淆。


4) 在語句塊中也可定義變數,它的作用域只限於當前語句塊。

全域性變數

在所有函式外部定義的變數稱為全域性變數(Global Variable,它的作用域預設是整個程式,也就是所有的原始檔,包括 .c 和 .h 檔案。例如:
  1. int a, b; //全域性變數
  2. void func1(){
  3. //TODO:
  4. }
  5. float x,y; //全域性變數
  6. int func2(){
  7. //TODO:
  8. }
  9. int main(){
  10. //TODO:
  11. return 0;
  12. }
a、b、x、y 都是在函式外部定義的全域性變數。C語言程式碼是從前往後依次執行的,由於 x、y 定義在函式 func1() 之後,所以在 func1() 內無效;而 a、b 定義在源程式的開頭,所以在 func1()、func2() 和 main() 內都有效。

區域性變數和全域性變數的綜合示例

【示例1】輸出變數的值:
  1. #include <stdio.h>
  2. int n = 10; //全域性變數
  3. void func1(){
  4. int n = 20; //區域性變數
  5. printf("func1 n: %d\n", n);
  6. }
  7. void func2(int n){
  8. printf("func2 n: %d\n", n);
  9. }
  10. void func3(){
  11. printf("func3 n: %d\n", n);
  12. }
  13. int main(){
  14. int n = 30; //區域性變數
  15. func1();
  16. func2(n);
  17. func3();
  18. //程式碼塊由{}包圍
  19. {
  20. int n = 40; //區域性變數
  21. printf("block n: %d\n", n);
  22. }
  23. printf("main n: %d\n", n);
  24. return 0;
  25. }
執行結果:
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。