Tips:

变量的引用过程,类似于栈。
就是说编译器从变量引用处以最近逻辑距离开始搜索,找到后则开始使用停止则停止搜索;如果查找失败则编译出错。

举个例子来说,就是优先引用函数内部的(逻辑距离最近),其次引用同一个源文件中全局的,如果函数内部、同一个源文件中没有,再引用包含文件中的。

返回值也是对变量的引用,当然是局部变量

___________________________________

全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件中说明)。

静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围 就是这个函数。

静态全局变量,只在本文件可以用,虽然整个程序包含多个文件,但静态全局变量只能用在定义它的那个文件里,却不能用在程序中的其他文件里。它是定义存储因型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就 分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的,只有程序运行结束后,才释放所占用的内存。

全局变量是没有定义存储类型的外部变量,其他用域是从定义点到程序结束,省略了存储类型符,系统将默认为自动型。

自动型变量存放在堆栈区中,堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的。

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

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

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

代码如下:  
  //test.cpp  
  #include     
  extern   int   a;//变量声明,不是定义  
  static   int   b=5;  
  void   func1()  
  {  
      cout<  }  
   
  //main.cpp  
  int   a;  
  int   b=10;  
  void   func2()  
  {  
      static   int   i;  
      i++;  
      cout<  }  
   
  void   func1();  
   
  void   main()  
  {  
      a=20;  
      func1();  
      func2();  
      func2();  
  }  
  输出结果为  
  5  
  20  
  1  
  2

——————————————————————————————————————————————————

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

从作用域看:

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

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

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

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

从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

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

1)、静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

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

Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

转载于:https://my.oschina.net/alphajay/blog/10417

全局变量 局部变量 静态变量相关推荐

  1. 深入理解C语言系列之内存和地址的故事(虚拟内存分区、全局变量与静态变量、外部函数内部函数、选择性编译)

    文章目录 一.内存的分区 二.虚拟内存分区 三.变量作用域与静态变量 四.外部函数与内部函数 五.include与define选择性编译 一.内存的分区 1.内存分为:物理内存和虚拟内存. 物理内存︰ ...

  2. 全局变量和静态变量以及内存堆栈的关系

    在编写程序时,内存的控制是很重要的一部分.关于全局变量和局部变量,静态变量的关系如何?以及他们在内存在是存储于哪部分的?做个记录,以便往后查看. 1. 全局变量和静态变量 全局变量:又称外部变量,与之 ...

  3. python中静态变量的作用_小白必读文章之全局变量与静态变量

    全局变量与静态变量 static 声明的变量在C语言中有两方面的特征: 1.变量被放在程序的全局存储区中,这样在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2.变量用s ...

  4. java 静态全局变量_静态变量static和全局变量global

    静态变量static , 全局变量global 静态变量 在java也叫类变量从名字可以看出它是属于某个类的而不是类的实例.它的关键字是static存储在静态存储区,当程序执行,类的代码被加载到内存, ...

  5. c++全局变量与静态变量

    概述: 全局变量和和由static修饰的静态变量都被储存在全局数据区.全局数据区的内存在程序运行时会被全部置'0'.这不同于局部变量,局部变量在栈上分配内存,但此块内存一般不为零,且编译器不会在局部变 ...

  6. 【C++】局部变量、全局变量、静态变量与动态对象的性质

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 概述 局部变量 在一个函数内部定义的变量(包括函数形参)是局部变量. 全局变量 在函数外定义 ...

  7. 局部变量、全局变量、静态变量

    局部变量 定义:局部变量指在程序中只在特定过程或函数中可以访问的变量.换言之,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些 ...

  8. 详解全局变量,全局变量与静态变量的区别

    特点: ① 作用域:全局可见.        全局变量(外部变量)是在函数外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾.        注:通常把超出一个函数的作用域称为全局作用域, ...

  9. react-native全局变量和静态变量使用

    react-native 多个类引入变量,可以使用下面三个方式 静态变量 全局变量的使用: 1 导入文件方式 2 全局变量方式 实现类 Test.js import {Button, Text, Vi ...

  10. C语言学习(7)——全局变量和静态变量

    数据传递:(3种方式) ①:参数传递 ②:返回值 ③:全局变量 extern:可以在另一个文件引入全局变量,不需要做初始化的操作. >>>>>>>>&g ...

最新文章

  1. 和 Houdini, CSS Paint API 打个招呼吧
  2. Big Data, Hadoop and StreamInsight™
  3. linux jdk 安装
  4. WifiManager的getScanResults()返回列表为0
  5. 二等水准数据平差_二等水准复测平差成果表
  6. java中final语句_Java中使用非final变量的不可访问语句
  7. Linux 命令(69)—— objcopy 命令
  8. 2017蓝桥杯B组:最长公共子序列(动态规划详解(配图))
  9. java double 存储_Java语言中:float、double在内存中存储方式
  10. GoogleNet家族
  11. c语言回文串试题,最短回文串 -- C语言
  12. linux wine-qq介绍2009版QQ精简
  13. CGLIB 动态代理使用
  14. 纯Java代码实现 企业微信钉钉 机器人群+告警
  15. Android、Python实现微信运动
  16. Teams 的 Meeting App
  17. 基于asyncio编写一个telegram爬虫机器人
  18. P124黎曼可积性刻画 的两个备注
  19. php 高洛峰 正则,PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP
  20. 成都艾司博讯:什么是拼多多网店的品质退款率?

热门文章

  1. 使用批处理build vs2005的工程
  2. 重磅推出Android4开发系列精品课程
  3. ensp配置access口_eNSP初学者配置以太网2种链路端口:access、trunk
  4. 程序员笔记 CherryTree 0.99.28 发布
  5. Python类常用的魔术方法
  6. style样式:json对象和字符串相互转化
  7. pytorch 训练过程acc_pytorch应用(四)训练过程可视化visdom
  8. winform获取appconfig配置文件得配置
  9. Jquery之append()和html()的区别
  10. 文字处理技术:正式开始新布局工作