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

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。

1.从作用域看:

(1)全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

(2)静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

(3)局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

(4)静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量

2.从分配内存空间看:

全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈分配空间。

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上没有什么不同。区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。

1、静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是他与堆栈变量和堆变量的区别

2、变量用static告知编译器,自己仅仅在变量的作用域范围内可见。这一点是他与全局变量的区别。

从以上分析可以看出,把局部变量改变为静态变量后是改变了他的存储方式,即改变了他的生存期。把全局变量改变为静态变量后是改变了他的作用域,限制了他的使用范围,因此static这个说明符在不同的地方起的作用是不同的。

TIPS:

1、若全局变量仅在单个文件中访问,则可以讲这个变量修改为静态全局变量。

2、若全局变量仅在单个函数中使用,则可以将这个变量修改为该函数的静态局部变量。

3、全局变量、静态局部变量、静态全局变量都存放在静态数据存储区。

4、函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

例子:

第一个printf打印静态全局变量a的值,为1。
fun1()对全局变量a重新赋值为2,因此第二个打印为2。
fun2()在函数内部重新声明了一个变量a,然后对该变量a赋值,该函数的作用域是本函数,并不影响全局变量a,因此第三个printf仍然为2。
fun3()在函数内部声明了一个静态变量a,并将其赋值为4,虽然该变量在函数执行结束后并不回收,但是其作用域仅限于本函数内部,printf同样不时,仍然是外部的全局变量a的值。

静态局部变量和全局变量的区别!相关推荐

  1. 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)...

    我们先来看内存中的几大区:  内存到底分几个区? 下面有几种网上的理解,我整理一下: 一: 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构 ...

  2. C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

    static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 面向过程设计中的static 全 ...

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

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

  4. (转)静态变量和全局变量的区别

    转自:http://blog.sina.com.cn/s/blog_63278e550100lcb9.html 全局变量与静态变量 static 声明的变量在C语言中有两方面的特征: 1.变量被放在程 ...

  5. c语言中全局变量多线程调用-局部变量、静态局部变量、全局变量与静态全局变量分析

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  6. Python精通-Python局部变量与全局变量的区别

    导语   在子程序定义的变量被称为是局部变量,在程序一开始定义的变量被称为是全局变量.全局变量的作用域是整个程序的生命周期,而局部变量的作用域知识在其定义的范围内可以使用.当全局变量与局部变量出现重名 ...

  7. 面向对象(特点)、局部变量与全局变量的区别、匿名对象、构造函数、

    一.     1,本文档为记录练习面向对象学习的文档. 2: 面向对象的三大特点: 1).封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,                优点:1.隔离了变化. ...

  8. 全局变量、静态全局变量、静态局部变量和普通局部变量的区别

    按存储区域分:全局变量.静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1.全局变量在整个工程文件内都有效: 2.静态全局变量只在定义它的文件内有效: 3. ...

  9. 静态全局变量、全局变量、普通局部变量、静态局部变量四者之间的区别

    按存储区域分:全局变量.静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1.全局变量在整个工程文件内都有效: 2.静态全局变量只在定义它的文件内有效: 3. ...

最新文章

  1. 深度学习常用数据集资源(计算机视觉领域)
  2. ExtJS入门教程03,form中怎能没有validation
  3. JSP中base href=%=basePath%作用
  4. Tomcat虚拟目录的配置
  5. BeetleX之HTTP网关部署
  6. 平稳时间序列的相关概念
  7. 从《乔家大院》悟企业留人
  8. history的使用方法
  9. 存储组件之MFS详解
  10. C#:using和new关键字
  11. HAL库版STM32双轮自平衡车(五) ———— 调参
  12. 博客从wordpress迁移到hexo
  13. 关于数学建模、机器学习与深度学习的思考
  14. 手机学二级计算机,计算机二级题库
  15. IVY throws IOException Resetting to invalid mark原因及解决办法
  16. 联想笔记本:安装适配自己电脑的驱动
  17. 静态分析工具综述:Roodi、Rufus、Reek和Flay
  18. 如何提取多元回归lm里面的全模型的R2和p值
  19. 历史上的今天:“超级计算机之父”诞生;三星推出移动支付;LibreOffice 发布...
  20. 免费的天气预报API接口--谷歌,雅虎,中央气象台

热门文章

  1. java学习之静态内部类
  2. 一个转角---程序猿
  3. java基础:任意进制到十进制的转换
  4. 尝鲜党:Nexus5、6刷安卓M教程
  5. 用Photoshop打造怀旧色调美女照片
  6. 清理系统盘遇到的问题
  7. 这种有序神经元,像你熟知的循环神经网络吗?
  8. 这些AI应用不简单,Keep首场技术开放日限时报名ing!
  9. Git基础之(二十)——标签管理——创建标签
  10. 图片浏览(CATransition)转场动画