當前位置:才華齋>計算機>C語言>

C語言區域性變數和全域性變數

C語言 閱讀(1.55W)

C語言允許直接訪問實體地址,可以直接對硬體進行操作。那麼大家知道C語言區域性變數和全域性變數是什麼呢?下面一起來看看!

C語言區域性變數和全域性變數

形參變數要等到函式被呼叫時才分配記憶體,呼叫結束後立即釋放記憶體。這說明形參變數的作用域非常有限,只能在函式內部使用,離開該函式就無效了。所謂作用域(Scope),就是變數的有效範圍。

不僅對於形參變數,C語言中所有的變數都有自己的作用域。決定變數作用域的是變數的定義位置。

區域性變數

定義在函式內部的變數稱為區域性變數(Local Variable),它的作用域僅限於函式內部, 離開該函式後就是無效的,再使用就會報錯。例如:

int f1(int a){ 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;}

a、b、x、y 都是在函式外部定義的'全域性變數。C語言程式碼是從前往後依次執行的,由於 x、y 定義在函式 func1() 之後,所以在 func1() 內無效;而 a、b 定義在源程式的開頭,所以在 func1()、func2() 和 main() 內都有效。

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

【示例1】輸出變數的值:

#include int n = 10; //全域性變數void func1(){ int n = 20; //區域性變數 printf("func1 n: %d", n);}void func2(int n){ printf("func2 n: %d", n);}void func3(){ printf("func3 n: %d", n);}int main(){ int n = 30; //區域性變數 func1(); func2(n); func3(); //程式碼塊由{}包圍 { int n = 40; //區域性變數 printf("block n: %d", n); } printf("main n: %d", 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。

【示例2】根據長方體的長寬高求它的體積以及三個面的面積。

#include int s1, s2, s3; //面積int vs(int a, int b, int c){ int v; //體積 v = a * b * c; s1 = a * b; s2 = b * c; s3 = a * c; return v;}int main(){ int v, length, width, height; printf("Input length, width and height: "); scanf("%d %d %d", &length, &width, &height); v = vs(length, width, height); printf("v=%d, s1=%d, s2=%d, s3=%d", v, s1, s2, s3); return 0;}

執行結果:

Input length, width and height: 10 20 30↙

v=6000, s1=200, s2=600, s3=300

根據題意,我們希望藉助一個函式得到三個值:體積 v 以及三個面的面積 s1、s2、s3。遺憾的是,C語言中的函式只能有一個返回值,我們只能將其中的一份資料,也就是體積 v 放到返回值中,而將面積 s1、s2、s3 設定為全域性變數。全域性變數的作用域是整個程式,在函式 vs() 中修改 s1、s2、s3 的值,能夠影響到包括 main() 在內的其它函式。