• C语言全局变量的一些简单介绍

    了解全局变量
    服务器君一共花费 16.737 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    全局变量是C语言语法和语义中一个很重要的知识点。全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。

    首先全局变量的存在意义需要从三个不同角度去理解:

    • 对于程序员来说,它是一个记录内容的变量(variable)
    • 对于编译/链接器来说,它是一个需要解析的符号(symbol)
    • 对于计算机来说,它可能是具有地址的一块内存(memory),一般存储在程序的data段中,因此它的生命期才会那么长。

    其次是语法/语义:

    • 从作用域上看,带static关键字的全局变量范围只能限定在文件里,否则会外联到整个模块和项目中;
    • 从生存期来看,它是静态的,贯穿整个程序或模块运行期间(注意,正是跨单元访问和持续生存周期这两个特点使得全局变量往往成为一段受攻击代码的突破口,了解这一点十分重要);
    • 从空间分配上看,定义且初始化的全局变量在编译时在数据段(.data)分配空间,定义但未初始化的全局变量暂存(tentative definition)在.bss段,编译时自动清零,而仅仅是声明的全局变量只能算个符号,寄存在编译器的符号表内,不会分配空间,直到链接或者运行时再重定向到相应的地址上。

    在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。例如:

    int a,b;  /* 外部变量 */
    void f1()
    {
        /* …… */
    }
    
    float x,y;  /* 外部变量 */
    int fz()
    {
        /* …… */
    }
    main()
    {
        /* …… */
    }
    

    从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x、y 定义在函数f1之后,而在f1内又无对x、y的说明,所以它们在f1内无效。a、b定义在源程序最前面,因此在f1、f2及main内不加说明也可使用。

    又比如:输入正方体的长宽高l、w、h。求体积及三个面x*y、x*z、y*z的面积。

    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;
    }
    main()
    {
        int v,l,w,h;
        printf("\ninput length,width and height(split by blank)\n");
        scanf("%d%d%d",&l,&w,&h);
        v=vs(l,w,h);
        printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);
    }
    

    外部变量与局部变量同名:

    int a=3, b=5;  /* a,b为外部变量 */
    max(int a,int b)   /* a,b为外部变量 */
    {
        int c;
        c=a>b ? a : b;
        return(c);
    }
    main()
    {
        int a=8;
        printf("%d\n",max(a,b));
    }
    

    如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。所以上面的程序输出8,而不是5。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [计算机算法] 从双端队列引出的卡特兰数 3 个条目
  2. [Python程序设计] Django模板系统 11 个条目
  3. [移动开发] Android加载器Loaders 5 个条目
  4. [Python程序设计] 从PHP到Python 3 个条目
  5. [PHP程序设计] PHP里的引用 5 个条目
  6. [Python程序设计] Django Web环境配置 2 个条目
  7. [PHP程序设计] PHP扩展模块安装 1 个条目
  8. [移动开发] Android属性系统Property 9 个条目
  9. [PHP程序设计] PHP数组的遍历 7 个条目
  10. [PHP程序设计] 声明式编程范式 12 个条目
  11. [数据库技术] 数据库范式篇 5 个条目
  12. [Linux操作系统] CentOS上使用EPEL Repository 2 个条目
窗口 -- [八点]