日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁(yè) 新聞資訊 >> 新聞?lì)^條 >> 局部變量與全局變量
新聞資訊
NEWS INFORMATION

局部變量與全局變量

發(fā)布時(shí)間:2019-05-22

在《C語(yǔ)言函數(shù)的參數(shù)和返回值形參變量要等到函數(shù)被調(diào)用時(shí)才分配內(nèi)存,調(diào)用結(jié)束后立即釋放內(nèi)存。這說(shuō)明形參變量的作用域非常有限,只能在函數(shù)內(nèi)部使用,離開(kāi)該函數(shù)就無(wú)效了。所謂作用域(Scope),就是變量的有效范圍。

不僅對(duì)于形參變量,C語(yǔ)言中所有的變量都有自己的作用域。決定變量作用域的是變量的定義位置。

局部變量

定義在函數(shù)內(nèi)部的變量稱為局部變量(Local Variable),它的作用域僅限于函數(shù)內(nèi)部, 離開(kāi)該函數(shù)后就是無(wú)效的,再使用就會(huì)報(bào)錯(cuò)。例如:

  1. int f1(int a){
  2. int b,c; //a,b,c僅在函數(shù)f1()內(nèi)有效
  3. return a+b+c;
  4. }
  5. int main(){
  6. int m,n; //m,n僅在函數(shù)main()內(nèi)有效
  7. return 0;
  8. }

幾點(diǎn)說(shuō)明:
1) 在 main 函數(shù)中定義的變量也是局部變量,只能在 main 函數(shù)中使用;同時(shí),main 函數(shù)中也不能使用其它函數(shù)中定義的變量。main 函數(shù)也是一個(gè)函數(shù),與其它函數(shù)地位平等。

2) 形參變量、在函數(shù)體內(nèi)定義的變量都是局部變量。實(shí)參給形參傳值的過(guò)程也就是給局部變量賦值的過(guò)程。

3) 可以在不同的函數(shù)中使用相同的變量名,它們表示不同的數(shù)據(jù),分配不同的內(nèi)存,互不干擾,也不會(huì)發(fā)生混淆。

4) 在語(yǔ)句塊中也可定義變量,它的作用域只限于當(dāng)前語(yǔ)句塊。

全局變量

在所有函數(shù)外部定義的變量稱為全局變量(Global Variable),它的作用域默認(rèn)是整個(gè)程序,也就是所有的源文件,包括 .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 都是在函數(shù)外部定義的全局變量。C語(yǔ)言代碼是從前往后依次執(zhí)行的,由于 x、y 定義在函數(shù) func1() 之后,所以在 func1() 內(nèi)無(wú)效;而 a、b 定義在源程序的開(kāi)頭,所以在 func1()、func2() 和 main() 內(nèi)都有效。

局部變量和全局變量的綜合示例

【示例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. }

運(yùn)行結(jié)果:
func1 n: 20
func2 n: 30
func3 n: 10
block n: 40
main n: 30

代碼中雖然定義了多個(gè)同名變量 n,但它們的作用域不同,在內(nèi)存中的位置(地址)也不同,所以是相互獨(dú)立的變量,互不影響,不會(huì)產(chǎn)生重復(fù)定義(Redefinition)錯(cuò)誤。

1) 對(duì)于 func1(),輸出結(jié)果為 20,顯然使用的是函數(shù)內(nèi)部的 n,而不是外部的 n;func2() 也是相同的情況。

當(dāng)全局變量和局部變量同名時(shí),在局部范圍內(nèi)全局變量被“屏蔽”,不再起作用;蛘哒f(shuō),變量的使用遵循就近原則,如果在當(dāng)前作用域中存在同名變量,就不會(huì)向更大的作用域中去尋找變量。

2) func3() 輸出 10,使用的是全局變量,因?yàn)樵?func3() 函數(shù)中不存在局部變量 n,所以編譯器只能到函數(shù)外部,也就是全局作用域中去尋找變量 n。

3) 由{ }包圍的代碼塊也擁有獨(dú)立的作用域,printf() 使用它自己內(nèi)部的變量 n,輸出 40。

3) C語(yǔ)言規(guī)定,只能從小的作用域向大的作用域中去尋找變量,而不能反過(guò)來(lái),使用更小的作用域中的變量。對(duì)于 main() 函數(shù),即使代碼塊中的 n 離輸出語(yǔ)句更近,但它仍然會(huì)使用 main() 函數(shù)開(kāi)頭定義的 n,所以輸出結(jié)果是 30。

【示例2】根據(jù)長(zhǎng)方體的長(zhǎng)寬高求它的體積以及三個(gè)面的面積。

  1. #include <stdio.h>
  2. int s1, s2, s3; //面積
  3. int vs(int a, int b, int c){
  4. int v; //體積
  5. v = a * b * c;
  6. s1 = a * b;
  7. s2 = b * c;
  8. s3 = a * c;
  9. return v;
  10. }
  11. int main(){
  12. int v, length, width, height;
  13. printf("Input length, width and height: ");
  14. scanf("%d %d %d", &length, &width, &height);
  15. v = vs(length, width, height);
  16. printf("v=%d, s1=%d, s2=%d, s3=%d\n", v, s1, s2, s3);
  17. return 0;
  18. }

運(yùn)行結(jié)果:
Input length, width and height: 10 20 30↙
v=6000, s1=200, s2=600, s3=300

根據(jù)題意,我們希望借助一個(gè)函數(shù)得到三個(gè)值:體積 v 以及三個(gè)面的面積 s1、s2、s3。遺憾的是,C語(yǔ)言中的函數(shù)只能有一個(gè)返回值,我們只能將其中的一份數(shù)據(jù),也就是體積 v 放到返回值中,而將面積 s1、s2、s3 設(shè)置為全局變量。全局變量的作用域是整個(gè)程序,在函數(shù) vs() 中修改 s1、s2、s3 的值,能夠影響到包括 main() 在內(nèi)的其它函數(shù)。

聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

南雄市| 克拉玛依市| 儋州市| 罗甸县| 竹山县| 莱芜市| 湘乡市| 龙江县| 邢台市| 康定县| 信宜市| 灌南县| 两当县| 连城县| 阜康市| 汶上县| 闽清县| 灵台县| 威海市| 南宁市| 霸州市| 桓台县| 平乡县| 徐汇区| 长沙市| 泾川县| 特克斯县| 贞丰县| 监利县| 城固县| 博客| 山阳县| 柏乡县| 巴彦淖尔市| 西吉县| 辽宁省| 辽阳县| 武强县| 日喀则市| 瑞安市| 仪征市|