全局变量与静态变量

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。局部变量的值不可知。

python中静态变量的作用_小白必读文章之全局变量与静态变量相关推荐

  1. python中匿名函数的作用_什么是Python中的匿名函数

    匿名函数 lambda x , y : x+y 1.匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的. 2.匿名函数的参数规则.作用域关系与有名函数是一样的. 3.匿名函数的函数体通常应该 ...

  2. python中装饰器的作用_如何理解Python装饰器

    展开全部 理解Python中的装饰器 @makebold @makeitalic def say(): return "Hello" 打印出如2113下的输出: Hello 你会怎 ...

  3. python中的array函数作用_数据分析的python基底(3)——array、Series、DataFrame笔记...

    <利用python进行数据分析>的第4.5章介绍了两个非常重要的包,NumPy和Pandas,这篇文章是我看这两章做的笔记,只列了要点和我觉得要留意的地方. 电子书和配套代码,还有一些学习 ...

  4. python中井号的作用_在python请求中处理井号(#)

    基本上,URL中的任何文本井号后的内容都是而不是发送到服务器.这适用于浏览器和requests.在 URL的格式表明type=#results部分实际上是一个查询参数.在 requests将自动编码查 ...

  5. python中main的作用_浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  6. python中pass语句的作用是什么_简述 Python 中 pass 语句的作用。

    [单选题]从总体中抽取的样本数据的频率分布直方图如图所示,若总体中85%的数据不超过b,则b的估计值为( ) [单选题]Graphically, competitive market supply i ...

  7. 计算机语言中str是什么意思,python中str函数的作用是什么

    python中str函数的作用是什么 发布时间:2021-04-27 16:12:24 来源:亿速云 阅读:56 作者:Leah python中str函数的作用是什么?相信很多没有经验的人对此束手无策 ...

  8. python中五种下划线 _

    python中五种下划线 "_" 单前导下划线:_var 单末尾下划线:var_ 双前导下划线:__var 双前导和末尾下划线:var 单下划线:_ 在文章结尾处,你可以找到一个简 ...

  9. 浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

最新文章

  1. 设计模式(三)外观模式
  2. 因为应用程序的并行配置不正确 sxstrace
  3. 多角度对比数据中心常见的三种走线方式
  4. 直播这把“火”,还能烧多久?
  5. python3源码剖析_T-SNE源码剖析(python版)
  6. python如何调用java写的接口_Python 调用翻译接口
  7. Linux——alias 设置别名详解
  8. IT人必去的几大网站,国内外知名IT网站罗列!
  9. 谷歌离线地图开发API
  10. WPF中使用Aforge控件
  11. 解决VMware卸载后再安装出现的问题
  12. 常用的浏览器及其内核
  13. 时点数列序时平均数_由时点数列计算序时平均数.ppt
  14. 未明学院:学员来稿 | 2019年中国电影分析报告
  15. python怎么使用数据库系统有什么好处_数据库简单介绍
  16. 提升网站关键词排名的技巧
  17. 关于G0、G1、G2、G3的名词解释
  18. IDEA如何简单的设置中文
  19. 回望2018,这6家AI+教育公司亮了!| AI最佳掘金案例榜...
  20. 【模电实验】【超值1 + 1】【验证性实验——比例、求和运算电路实验】【验证性实验——各种非正弦信号发生器实验】

热门文章

  1. 简单的javascript学习01
  2. python第五章课后题答案超星_Python数据分析与数据可视化章节考试题库
  3. python有什么用会计专业,财务人员学python有用吗
  4. 晶晨方案Burn_Card_Maker工具v2.0.2
  5. 【每日一题Day35】LC878第N个神奇数字 | 二分查找 找规律 + 数学
  6. 哈工大深圳计算机研究生院导师,哈工大深圳研究生院学科设置及合作导师情况.doc...
  7. 基于vscode安装pytorch
  8. 1.系统进程与计划任务管理
  9. Android之 Camera相机使用
  10. linux 字符集转换命令,Linux下GBK编码到UTF-8文件编码转换方法