简单解读局部变量和全局变量

    作者:课课家教育更新于: 2016-11-29 18:10:22

    大神带你学编程,欢迎选课

      什么是C语言中的变量?局部和全局变量又是什么?它们在编写程序的过程中发挥怎样的作用?今天课课家笔者为大家详细介绍局部变量和全局变量的概念和作用。

      在函数的参数和返回值中我们认识到形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量只能在函数内部使用,离开该函数就无效了。

      所谓作用域(Scope),就是变量的有效范围。不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。

      ◎局部变量

      所谓局部变量(LocalVariable),简而言之就是定义在函数内部的变量,它的作用域仅限于函数内部,离开该函数后就是无效的,再使用就会报错。比如:

      intf1(inta){

      intb,c;//a,b,c仅在函数f1()内有效

      returna+b+c;

      }

      intmain(){

      intm,n;//m,n仅在函数main()内有效

      return0;

      }

      这里需要我们注意以下四点:

      ①在main函数中定义的变量也是局部变量,只能在main函数中使用;同时main函数中也不能使用其它函数中定义的变量。main函数也是一个函数,与其它函数地位平等。

      ②形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。

      ③可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。

      ④在语句块中也可定义变量,它的作用域只限于当前语句块。

      以下是局部变量的一个任意例子(图1)

    局部变量例子

     

    图1  

      ◎全局变量

      所谓全局变量(GlobalVariable),简而言之就是在所有函数外部定义的变量,它的作用域默认是整个程序,也就是所有的源文件,包括.c.h文件。比如:

      inta,b;//全局变量

      voidfunc1(){

      //TODO:

      }

      floatx,y;//全局变量

      intfunc2(){

      //TODO:

      }

      intmain(){

      //TODO:

      return0;

      }

      a、b、x、y都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于x、y定义在函数func1()之后,所以在func1()内无效;而a、b定义在源程序的开头,所以在func1()、func2()和main()内都有效。

      下面笔者给大家看看局部变量和全局变量的代码例子:

      代码例子1:输出变量的值:

      #include

      intn=10;//全局变量

      voidfunc1(){

      intn=20;//局部变量

      printf("func1n:%d\\n",n);

      }

      voidfunc2(intn){

      printf("func2n:%d\\n",n);

      }

      voidfunc3(){

      printf("func3n:%d\\n",n);

      }

      intmain(){

      intn=30;//局部变量

      func1();

      func2(n);

      func3();

      //代码块由{}包围

      {

      intn=40;//局部变量

      printf("blockn:%d\\n",n);

      }

      printf("mainn:%d\\n",n);

      return0;

      }

      运行结果:

      func1n:20

      func2n:30

      func3n:10

      blockn:40

      mainn:30

      代码中虽然定义了多个同名变量n,但它们的作用域不同,在内存中的位置(地址)也不同,所以是相互独立的变量,互不影响,不会产生重复定义(Redefinition)错误。

      ①对于func1(),输出结果为20,显然使用的是函数内部的n,而不是外部的n;func2()也是相同的情况。当全局变量和局部变量同名时,在局部范围内全局变量被“屏蔽”,不再起作用。或者说,变量的使用遵循就近原则,如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。

      ②func3()输出10,使用的是全局变量,因为在func3()函数中不存在局部变量n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量n。

      ③由{}包围的代码块也拥有独立的作用域,printf()使用它自己内部的变量n,输出40。

      ④在C语言中规定,只能从小的作用域向大的作用域中去寻找变量而不能反过来执行,我们使用更小的作用域中的变量。对于main()函数,即使代码块中的n离输出语句更近,但它仍然会使用main()函数开头定义的n,所以输出结果是30。

      代码例子2:根据长方体的长宽高求它的体积以及三个面的面积。

      #include

      ints1,s2,s3;//面积

      intvs(inta,intb,intc){

      intv;//体积

      v=a*b*c;

      s1=a*b;

      s2=b*c;

      s3=a*c;

      returnv;

      }

      intmain(){

      intv,length,width,height;

      printf("Inputlength,widthandheight:");

      scanf("%d%d%d",&length,&width,&height);

      v=vs(length,width,height);

      printf("v=%d,s1=%d,s2=%d,s3=%d\\n",v,s1,s2,s3);

      return0;

      }

      运行结果:

      Inputlength,widthandheight:102030↙

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

      根据事先定下的目标,我们要通过一个函数得到三个值:分别是体积v以及三个面的面积s1、s2、s3,但由于C语言中的函数只能有一个返回值,我们只能将其中的一份数据也就是体积v放到返回值中,而将面积s1、s2、s3设置为全局变量。全局变量的作用域是整个程序,在函数vs()中修改s1、s2、s3的值,从而会影响到包括main()在内的其它函数。

      本次简单解读局部变量和全局变量的教程到此暂告一段落,如果以后有补充的话笔者会在此继续补充,同时欢迎大家的继续补充。最后希望这次教程对大家学习C语言能够起到一定的帮助作用!

课课家教育

未登录

1