• C语言 局部变量和全局变量


    一、局部变量
    在一个 函数 内部 定义的变量叫做 局部变量,它只在 本函数范围内有效。也就是说,只有在本函数内才能使用它们,在本函 数外是不能使用这些变量的。
    #include
    //函数声明
    void func1(int tmpvalue);
    int main()
    {
        int m,n;  //局部变量,但是只在main()函数内有效
        int k=4;   //局部变量,但是只在main()函数内有效
        return 0;
        //1、主函数main()中定义的变量m,n,k只在主函数中有效,虽然主函数调用了其他函数,但是在其他函数中依旧无法使用主函数中定义的变量
        //2、不同的函数可以使用相同的变量名,互不干扰。
        //3、形式参数,也是局部变量,比如func1中的tmpvalue,只在func1函数中有效。
        //4、有一种特殊写法,用一个大括号写一段代码,大括号括起来的这个叫复合语句,在该复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也叫程序块
        int a,b; //这里的有效范围直到函数末尾
        //....
        {
          int c; //c有效范围只在这个复合语句内,一旦离开复合语句,变量的内存就被系统释放掉了。
          c=a+b;
        }
    }
    //函数定义
    void func1(int tmpvalue)
    {
        //这里无法使用main()函数中定义的m,n,k
        int x,y;  //局部变量,但是只在func1()函数内有效
        int m,n;  //这里的和main()中的m,n完全不同,占用的内存地址也完全不同。
    }
    一个项目可以由一个或者多个源程序文件(project1.cpp)组成。
    二、全局变量
    函数 定义的变量称为 全局变量(外部变量)。 可以为本文件中其他函数共用
    全局变量的有效范围: 从定义变量的位置开始本源程序文件结束
    如果你在整个文件开头定义了该变量,则整个文件范围内都可以使用该全局变量。
    总结:在一个函数中,既可以使用本函数中的局部变量,又可以使用有效的全局变量。
    1. #include
    2. //函数声明
    3. void func1(int tmpvalue);
    4. int p=1,q=5;  //全局变量,因为在函数外部定义的
    5. //函数定义
    6. void func1(int tmpvalue)
    7. {
    8.     //这里无法使用main()函数中定义的m,n,k
    9.     int x,y;  //局部变量,但是只在func1()函数内有效
    10.     int m,n;  //这里的和main()中的m,n完全不同,占用的内存地址也完全不同。
    11. }
    12. char c1,c2;  //全局变量,从定义的位置,到文件末尾结束
    13. char f2(int x,int y)
    14. {
    15.     int i,j;
    16.     return 0;
    17. }
    18. int main()
    19. {
    20.     int b,c;
    21.     return 1;
    22. }
    全局变量的优缺点:
    优点:增加了函数与函数之间的数据联系渠道,如果一个函数中改变了全局变量的值,就能影响到其他函数,相当于在各个函数之间有了直接的传递通道,不再需要通过实参和形参来传递参数值了。
    缺点:
    a.只有在必要的时候才使用全局变量(要谨慎使用),因为全局变量在程序运行整个周期之间都占用内存,而不像函数内的局部变量(当函数执行完毕后,局部变量所占的内存会被系统回收)。
    b.降低了函数的通用性,因为函数执行时要以来这些外部的全局变量了,如果将函数迁移到另外一个文件中,那这些相关的外部变量就一起跟着移植过去,并且如果你迁移到另外一个文件中也有同名全局变量,那就更加麻烦。
    c.东一个全局变量,西一个全局变量,降低了程序的清晰性和可读性,读程序的人难以清楚的判断每个瞬间各个外部变量的值。(因为很多函数都可以改变全局变量的值),所以,要限制使用全局变量。
    1. #include
    2. //函数声明
    3. void func1(int tmpvalue);
    4. int c1=4,c2=5;  //全局变量,因为在函数外部定义的
    5. //函数定义
    6. void lookvalue()
    7. {
    8.   c1=6;  //给全局变量赋值
    9.   c2=9;
    10.   return;
    11. }
    12. int main()
    13. {
    14.     
    15.     lookvalue();
    16.     printf("c1=%d\n",c1);
    17.     printf("c2=%d\n",c2);
    18.     return 0;
    19. }

    总结:
    (1)、如果某个函数想 引用在他后面定义的全局变量,则可以用一个关键字叫 extern 做一个“ 外部变量说明”,表示该变量在函数的外部定义,这样函数内就能使用,否则编译就会出错。
    所以,结论是全局变量(外部变量)的定义就放在引用他的所有函数之前,就可以避免使用这个extern。
    (2)、要严格区分 外部变量与一个 外部变量说明
    外部变量的定义 只能有一次,位置是所有函数之外,定义时 会分配内存,定义时 可以初始化值
    而同一个文件中,外部变量说明是 可以有很多次的(外部变量说明 不分配内存),外部变量声明 放在最上面,所有函数之外。也可以在每个函数之内做外部变量说明(但是这个声明了的变量仅仅在函数内有效),因此进一步加深了对外部变量说明的理解:所声明的变量是已在外部定义过的变量,extern这个声明,仅仅是为了引用该变量而做的“声明”。
    1. #include
    2. //函数声明
    3. void func1(int tmpvalue);
    4. extern int c1,c2;  //外部变量说明,表示某个地方定义了c1,c2这两个全局变量。【不是定义,不分配内存的】
    5. //函数定义
    6. void lookvalue()
    7. {
    8.   c1=6;  //如果这里要使用全局变量的话,就要进行全局变量说明
    9.   c2=9;
    10.   return;
    11. }
    12. int c1=4,c2=5;  //定义全局变量,因为在函数外部定义的【是定义,系统会分配内存的】
    13. int main()
    14. {
    15.     
    16.     lookvalue();
    17.     printf("c1=%d\n",c1);
    18.     printf("c2=%d\n",c2);
    19.     return 0;
    20. }
    (3)、在同一个源文件中,如果全局变量和局部变量 同名,则 在局部变量作用范围内全局变量 不起作用(当然值也不会受到 影响)。
    1. 例题一:
    2. #include
    3. //函数声明
    4. void func1();
    5. int c1=4,c2=5;  //全局变量,因为在函数外部定义的
    6. //函数定义
    7. int main()
    8. {
    9.     func1();
    10.     printf("函数外的c1=%d\n",c1);  //打印出来的全局变量
    11.     printf("函数外的c2=%d\n",c2);
    12.     return 0;
    13. }
    14. void func1()
    15. {
    16.     int c1,c2;
    17.     c1=100;  //这里是给局部变量赋值,而不是全局变量赋值
    18.     c2=200;
    19.     printf("函数内的c1=%d\n",c1);  //打印出来的局部变量
    20.     printf("函数内的c2=%d\n",c2);
    21. }
    1. 例题二:
    2. #include
    3. int a=10,b=20;  //全局变量,因为在函数外部定义的
    4. //函数定义
    5. void lookvalue(int a,int b)
    6. {
    7.     //在局部变量作用范围内,全局变量不起作用
    8.     a=100;
    9.     b=200;
    10.     return;
    11. }
    12. int main()
    13. {
    14.     a=4;
    15.     b=5;
    16.     printf("函数外的c1=%d\n",a);  //4
    17.     printf("函数外的c2=%d\n",b);  //5
    18.     lookvalue(a,b);
    19.     printf("函数外的c1=%d\n",a);  //4
    20.     printf("函数外的c2=%d\n",b);  //5
    21.     return 0;
    22. }
  • 相关阅读:
    hp-unix 数据库服务起不来
    纹波类型及纹波抑制措施
    Java 面试中遇到的坑
    数据库基础(一)
    阿里云通用算力型u1云服务器配置性能评测及价格参考
    ssm基于安卓android的失物招领APP-计算机毕业设计
    【ensp实验】Telnet 协议
    IT部门全被裁?不懂业务,花了几百万开发的报表系统,根本没人看
    基于遗传优化的模糊聚类算法的MATLAB仿真
    二叉树(暑假每日一题 31)
  • 原文地址:https://blog.csdn.net/qq_48516121/article/details/127039671