转自:http://blog.sina.com.cn/s/blog_63278e550100lcb9.html

全局变量与静态变量

static 声明的变量在C语言中有两方面的特征:
1.变量被放在程序的全局存储区中,这样在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2.变量用static告知编译器,自己仅在变量的作用范围内可见。这一点是它与全局变量的区别。
Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量的情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

扩展分析:术语static有着不寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

全局变量、静态全局变量、静态局部变量和局部变量的区别

变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。

按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。

按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,并且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

static函数与普通函数作用域不同,只在定义该变量的源文件内有效。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数与普通函数作用域不同,只在定义该变量的源文件内有效;

全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。

转载于:https://www.cnblogs.com/heluan/p/8576663.html

(转)静态变量和全局变量的区别相关推荐

  1. php局部变量和全局变量的区别,PHP局部变量、静态变量、全局变量和超全局变量的使用和区别...

    首先,PHP 中从变量的范围上可以分为 4 类,分别是静态变量.局部变量.全局变量和超全局变量. PHP 局部变量与全局变量 在 PHP 中中全局变量和局部变量的定义是和 C 语言类似的.在函数外定义 ...

  2. 静态局部变量和全局变量的区别!

    静态局部变量和全局变量的区别! C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 1.从作用域看: (1)全局变 ...

  3. python局部静态变量_全局变量、局部变量和静态变量

    全局变量和局部变量在写代码时需要区分清楚,不然会出大问题.不同语言定义不同范围的变量的写法有很大的区别. 那么静态变量是在什么场景下用到呢?我们来假设这样一个场景:在函数内部定义的变量,当程序执行到它 ...

  4. java中成员变量和全局变量的区别_成员变量与全局变量的区别

    全局变量:也叫成员变量,是指在类中定义的变量:它在整个类中都有效 全局变量又可分为:类变量和实例变量 1.类变量:又叫静态变量  用static修饰  它可以直接用类名调用  也可以用对象调用   而 ...

  5. linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...

    转自:http://blog.csdn.net/gongweijiao/article/details/8207333 原文参见:http://blog.163.com/xychenbaihu@yea ...

  6. java数据段 静态区_linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...

    一)概述 .堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储. .堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说 ...

  7. 类变量、成员变量、实例变量、局部变量、静态变量、全局变量 的解释。

    类体由2部分构成: 一部分是变量的定义; 一部分是方法的定义(一个类中可以有多个方法) 在变量定义部分定义的变量叫做类的成员变量,成员变量在整个类中都有效. (全局变量应该是成员变量的俗称) 在方法体 ...

  8. C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置

    先看几个概念: 1.bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0.bss段属于静态内存分配.它的初始 ...

  9. 怎么调出全局搜索_局部静态变量只能初始化一次?它是怎么实现的

    静态变量可以分为全局静态变量,和局部静态变量,先来说说全局的吧 全局静态变量和全局变量的区别并不大,只是全局静态变量只能在当前文件中使用,而在反汇编中二者并无区别,只可以在当前文件中使用,不过是编译器 ...

最新文章

  1. Quartus和Modelsim中使用`include包含头文件的对比
  2. Jquery的深度拷贝和深度克隆
  3. 开源 serverless 产品原理剖析 - Kubeless
  4. 【学习笔记】操作系统之哲学原理
  5. 音视频技术开发周刊 69期
  6. 可以获得索引值码_SEO优化可以为网站带来更高的业务销售额
  7. JSFinder—从js文件中寻找敏感接口和子域名
  8. JS工具类——Select操作类
  9. android搭建客户端,用Android搭建客户端 手机和服务器交互开发实例
  10. 人工智能TensorFlow工作笔记004---还记得标准差嘛_标准差的由来
  11. SaaS架构设计之高性能的Multi-Tenant最佳实践
  12. Hadoop版本比较
  13. html图片旋转动画
  14. 苹果系统与win10连接到服务器,Win10下苹果设备连接电脑没有反应的解决方法
  15. 广大银行java 面试_2018光大银行春季招聘面试题目及答案
  16. 1024购书狂欢节,优惠券送给有需要的伙伴们
  17. 计算机编程课是学什么的,编程是什么课程
  18. Redis(1)入门指令
  19. 179 Largest Number
  20. C语言之strcmp函数和strncmp函数

热门文章

  1. Python 第五章 数据预处理
  2. AI软件制作莫比乌斯环
  3. php修改ip6地址为ip4,CentOS7 设置静态IPv6/IPv4地址
  4. php 空二位数组,php对二维数组进行相关操作(排序、转换、去空白等),php二维数组_PHP教程...
  5. 出场顺序很重要下一句_人生如戏,出场顺序很重要:再见,不负遇见
  6. 七牛HTML 上传按钮,七牛 JSSDK 配置+常见问题
  7. 松下机器人找原点步骤_桁架机器人在汽车座椅安装生产线中的应用
  8. 做了项目才知道的Cookie和Session
  9. 数字图像识别笔记(第一章绪论)
  10. 图像算法三:【图像增强--空间域】图像平滑、中值滤波、图像锐化