zoukankan      html  css  js  c++  java
  • 全局变量和局部变量

    在《C语言函数的参数和返回值》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。所谓作用域(Scope),就是变量的有效范围。

    不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。

    局部变量

    定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。例如:

     1 int f1(int a)
     2 {
     3     int b,c;  //a,b,c仅在函数f1()内有效
     4     return a+b+c;
     5 }
     6 int main()
     7 {
     8     int m,n;  //m,n仅在函数main()内有效
     9     return 0;
    10 }

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

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

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

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

    全局变量

    在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。例如:

     1 int a, b;  //全局变量
     2 void func1()
     3 {
     4     //TODO:
     5 }
     6 float x,y;  //全局变量
     7 int func2()
     8 {
     9     //TODO:
    10 }
    11 int main()
    12 {
    13     //TODO:
    14     return 0;
    15 }

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

    局部变量和全局变量的综合示例

    【示例1】输出变量的值:

     1 #include <stdio.h>
     2 int n = 10;  //全局变量
     3 
     4 void func1()
     5 {
     6     int n = 20;  //局部变量
     7     printf("func1 n: %d
    ", n);
     8 }
     9 
    10 void func2(int n)
    11 {
    12     printf("func2 n: %d
    ", n);
    13 }
    14 
    15 void func3()
    16 {
    17     printf("func3 n: %d
    ", n);
    18 }
    19 int main()
    20 {
    21     int n = 30;  //局部变量
    22     func1();
    23     func2(n);
    24     func3();
    25     //代码块由{}包围
    26     {
    27         int n = 40;  //局部变量
    28         printf("block n: %d
    ", n);
    29     }
    30     printf("main n: %d
    ", n);
    31     return 0;
    32 }

    运行结果:
    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】根据长方体的长宽高求它的体积以及三个面的面积。

     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
    ", v, s1, s2, s3);
    17     return 0;
    18 }

    运行结果:
    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() 在内的其它函数。

  • 相关阅读:
    JavaScript 正则表达式
    git常用命令
    用纯css使内容永远居在页面底部
    Oracle中随机抽取N条记录
    表数据回复到某个时候
    oracle同名存储过程被覆盖后如何恢复(转)
    mybatis+spring+mysql
    定位
    关于js的闭包和复制对象
    idea展示runDashboard的窗口
  • 原文地址:https://www.cnblogs.com/liangbo-1024/p/9239102.html
Copyright © 2011-2022 走看看