zoukankan      html  css  js  c++  java
  • C语言关键字 乱世枭雄:static与extern

    ++++++++++++++++++++++++++++++++++++++++++

    《C语言深入理解系列 - 乱世枭雄:static与extern》

    查看其它博文请关注原创作者。

    本文系本站原创,欢迎转载! 转载请注明出处:

    http://blog.csdn.net/mr_raptor/article/details/7211267

    ++++++++++++++++++++++++++++++++++++++++++

    乱世枭雄:static与extern

    描述:在C程序世界里,不同代码国度以.c文件为国界分隔开来,在单个国家(C源文件)里有不同的函数占山为王,军阀割据,每个C程序世界里只有一个君主main和其首都(main函数体),main通过下传圣旨(参数),调用各种军阀(函数),来掌控整个C程序世界的有序运行。在和谐世界的幌子下,却是别番风景,某军阀(函数)心怀叵测,不想单纯听从于main的指挥与调度,树立了自己的政权旗帜static。static不用听附与main的调度,自己做主,私藏金库(空间)。而main对此却很无奈,因为相对static来说,extern更是让它皇权难保。不同的国家(不同的.c文件)之间通过extern相互私通,传递信息。二者联合作乱,让编程者逻辑混淆。当然,如果编程者连一个国家都没有走出去过(指将所有代码写到一个.c文件里),不能够上升到一个宏观的角度,将不知所云。乱世出枭雄,切听我慢慢道来其中一二。

    作用:简单来说static修辞变量,就是指该变量空间独立于函数中的auto变量或叫栈变量(请查看auto关键字章节),static变量空间在内存中的静态区内被分配。如图xxx所示。

    图xxx 程序内存分布示意图

    在使用static的时候一定要注意以下两点:

    1.       static变量在程序运行(main启动)之前就已经被分配,它不像是局部变量那样动态在栈上分配的,它在程序彻底退出之后才被释放。

    2.       static变量有访问权限,在子函数里声明的static变量,只能在该函数内访问,如果static变量在函数体外声明,它的访问权限就是本文件内。

    3.       static不仅可以修辞变量,还可以用来修辞函数,如果用来修辞函数,和第2条有着相似的意义,表示该函数访问权限限制在本源文件内。

    记住以上三点,可以解释很多初学者不明白的问题:

    • 为什么子函数里声明的static变量,每次访问其值都是上一次的结果?答案见要点1。
    • 为什么子函数里的static变量不能在子函数外面访问?答案见要点2。
    • 如何避免不同文件里命名冲突的问题?答案见要点3。

    带着上面的理解,再回头理解描述里的小故事:乱世枭雄。

    extern是指,当前变量或函数不是在本源文件内声明的,它是外部变量或外部函数,正所谓“外来的和尚会念经”,能很好的体现extern的价值。当我们在本文件里试图引用一个外部声明的全局变量或函数时,可以在其前面加上extern,表示它是外来和尚。

    宏观理解:通过上面的分析看来,C程序里,通过函数将功能区分开来,每个函数完成一个功能(这也是为什么函数的英文叫function),而又将一片相关联的功能集合在一个源文件里,这些功能和相关联的功能之间通常要有联系,而这种联系(亦可叫通信)就是通过static和extern进行联系起来的,当然这里面还要有头文件的功劳,关于头文件的解释,后面会单独拿来分析。

    常见错误理解:

    菜鸟:static表示常量。

    你要这么说const关键字哭了。static不表示常量,理解它就从上述3点来理解。

    菜鸟:static表示其值会被记录住。

    这么说只是片面理解。

    ++++++++++++++++++++++++++++++++++++++++++

    《C语言深入理解系列 - 乱世枭雄:static与extern》

    查看其它博文请关注原创作者。

    本文系本站原创,欢迎转载! 转载请注明出处:

    http://blog.csdn.net/mr_raptor/article/details/7211267

    ++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    Linux内核网络协议栈优化总纲
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458043.html
Copyright © 2011-2022 走看看