1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:

全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

从作用域看:

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

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

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

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

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

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

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

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

Tips:

  A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

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

转载于:https://www.cnblogs.com/6duxz/p/4616578.html

C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)相关推荐

  1. c语言 引用定义变量,如何在c语言中定义及引用全局变量?

    如何在c语言中定义及引用全局变量? 答案:5  信息版本:手机版 解决时间 2019-10-03 10:30 已解决 2019-10-02 15:19 如何在c语言中定义及引用全局变量? 最佳答案 2 ...

  2. c语言中(*p)[5]与*P[5]的区别

    (*p)[5]与*P[5]有什么区别,看代码 main() { char a[5]={'A','E','C','D'};//数组指针char (*p3)[5] = a;//在栈中产生一个大小为 5个c ...

  3. C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解

    前言 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets().他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输 ...

  4. c语言中赋值表达示与复制语句的区别

    最大区别: 赋值语句后面必须要有分号,(其实是语句都必须有分号),如i=i+1 是赋值表达示,而i=i+1:是赋值语句. 赋值运算符: "=",它的作用是将一个数据(可以是一个表达 ...

  5. c语言从文件中读取数据存入数组_在c语言中数组 a[i++] 和 a[++i]的 区别? 数组a[0]++又是什么意思?...

    在c语言中,数组 a[i++] 和数组 a[++i] 有区别吗? 首先我们先看下面的内容: b = a++; //先计算表达式的值,即先把a赋值给了b:然后a再自加1. b = ++a: //先a自加 ...

  6. C语言中字符数组char[] 和 字符串char*的区别

    在程序结构设计中使用结构体定义新的数据类型,如 typedef struct { int type; int value; char arg[]; } CommandInfo; 在strcpy时将一个 ...

  7. C语言中的单引号和双引号的区别

    首先肯定地说,二者是有区别的,不是说用谁都一样. 1.实质区别,代表的含义不同 'A'代表的是一个整数,而且这个整数对应的是编译器所采用的字符集中的字符序列对应的数值.所以'A'跟ASCII中的65意 ...

  8. C语言中两个反正切函数atan与atan2的区别

    我们可以使用正切操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将他转换为相应的角度.as中有两个函数可以计算反正切,我们来看一下. 1.as中Math.atan() M ...

  9. c语言中fmod,C语言中 %与fmod()在计算余数时的区别与联系

    %与fmod()在计算余数时的区别与联系 一.% 运算符 % 只用于整型的计算,后一个数不能是0,参与运算的数据可正可负. 对于x%y ,计算之后结果的正负与x的符号相同,如果前者是较小的数,后者是较 ...

  10. C语言里的4种存储类别,C语言中变量储存的类别

    C语言中变量储存的类别 C语言根据变量的生存周期来划分,可以划分为静态存储方式和动态存储方式. C语言中变量储存的类别 静态存储方式:是指在程序的运行期间分配固定的存储空间的方式.静态存储区中存储放了 ...

最新文章

  1. linux的翻译系统开发,Linux系统下的翻译神器——Goldendict
  2. 缩略图信息提取工具vinetto
  3. android 随意漂浮动画,Android实现气泡漂浮动画,类似IOS Game Center中气泡动画
  4. manjaro笔记本显卡驱动_从入门到高端!AMD Radeon RX 500系列移动显卡全解析
  5. QML模块定义qmldir文件
  6. BOM对象有哪些,列举window对象?
  7. oracle 获取awk报告,Oracle 使用 ass.awk 工具查看 system state dump 说明
  8. 亚马逊吸尘器需要提交UL1017测试报告,亚马逊要求提供ISO17025资质机构出具的UL报告
  9. html转word 文档 doc docx
  10. 笔记本电脑怎么找计算机硬盘,如何给笔记本电脑硬盘分区
  11. android绘制简单饼状图,Android 绘制饼状图
  12. win7系统两台计算机共享文件,教你设置win7系统的两台电脑实现文件共享的详细步骤...
  13. 如何做一名有趣的家长?
  14. 轮播一页显示多少条数据
  15. 引起计算机故障的因素有哪些,电源故障引起的电脑问题有哪些
  16. 【VUE】2、VUE-CREATE创建第一个VUE项目
  17. jooq 执行sql_jOOQ星期二:Markus Winand执行现代SQL任务
  18. hive 复杂数据类型 在数仓中应用(array、map、struct、和其组合应用)
  19. Windows 使用命令强制删除文件及文件夹
  20. POJ 3055 Digital Friends 笔记

热门文章

  1. Linux运维问题解决(3)——VMware启动虚拟机报错 : 该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取(T)
  2. linux_manjaro常用软件安装
  3. java程序组成_java程序是由什么组成的
  4. 看完数据分析师一天的工作,才明白为什么人家年薪50W
  5. 别被忽悠了!我来谈谈大数据平台的4个要点,你们写的都不是干货
  6. idea中npm安装总结与node-sass依赖安装等常见问题避坑总结
  7. 读书笔记--云边有个小卖部
  8. Python os模块 -Python系统编程中的操作模块
  9. python辅助脚本教程_[Python] 用python做一个游戏辅助脚本,完整思路
  10. C# list删除 另外list里面的元素_[Python]列表(list)操作