全局变量和局部变量的区别
一、从作用域看:
- 全局变量:其作用范围是“整个工程”,只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量
- 静态全局变量:使用 static 关键字修饰,也具有全局作用功能,和全局变量区别在于如果该程序包含多个文件,其作用范围仅在定义的那个文件,不能作用于其它文件,这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量
- 局部变量:仅仅从定义的位置开始,到定义它的右花括号结束,只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回
- 静态局部变量:局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,和局部变量的区别在于函数执行完也还存在
二、从生存期看:
- 全局变量:随进程持续性
- 静态全局变量:随进程持续性
- 局部变量:从定义开始到函数结束,函数调用后变量就被撤销,内存被回收
- 静态局部变量:随进程持续性,static 修饰的局部变量其生存期从函数变为整个进程
三、从内存分配看:
- 全局变量:全局(静态)存储区
- 静态全局变量:全局(静态)存储区
- 局部变量:存放在栈中,只有在所在函数被调用时才动态地为变量分配存储单元
- 静态局部变量:全局(静态)存储区
注:
- 全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0
- 静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别
- 变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别
- 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
参考:http://blog.sina.com.cn/s/blog_4aae007d0100inxi.html
全局变量和局部变量的区别相关推荐
- Java全局变量和局部变量的区别
java中的变量分为成员变量和局部变量,它们分别是 成员变量: 成员变量是在类的范围里定义的变量. 成员变量有初始值,初始值为变量类型的默认值. 没有被static修饰的成员变量存储在对象所在的堆内存 ...
- java 全局变量和局部变量的区别
全局变量和局部变量的简介: 1.全局变量:描述对象有什么(在类中定义),类中所有方法都可以使用. 2.局部变量:临时保存数据(在类的方法中定义),只能在当前方法中使用. 全局变量和局部变量的区别: 1 ...
- 在shell中全局变量与局部变量的区别及其举例
主要区别: 1.作用域不同:全局变量的作用域为整个程序,它的声明在后面的各个部分都可以发生作用,而局部变量仅仅为定义的某个函数.且局部变量只能在局部进行使用. 2.优先级不同:局部变量优先于全局变量. ...
- C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 面向过程设计中的static 全 ...
- python中全局变量和局部变量的区别_Python全局变量与局部变量区别及用法分析
本文实例讲述了Python全局变量与局部变量区别及用法.分享给大家供大家参考,具体如下: 对于很多初学的同学,对全局和局部变量容易混淆,看看下面给大家的讲解相信都应该明白两者的区别了. 定义: 全局变 ...
- 全局变量和局部变量的区别_值得收藏!8大技巧,带你了解菜鸟和高手的区别!...
对于Python编程者而言,或许大家都认为Python是非常简单易学的,在学习一段时间的Python之后,都认为自己的Python编程水平已经非常好了,但是python编程绝对不是简单的几句语法就可以 ...
- Java中的全局变量和局部变量——简单区别
全局变量 Java中不能定义全局变量,在一个类中的公共.静态变量就相当于这个类的全局变量. 这使得全局变量被封装在了类里,保证了安全性. 局部变量 Java中方法体或某个代码块中声明的变量被称为局部变 ...
- python 全局变量和局部变量的区别
python 变量 1. 全局变量:在整个py文件中声明,运行时始终有效. 2. 局部变量:在函数内部声明,函数运行时有效. 3. 局部变量只能访问全局变量,不能更改(可读不可写) c = 1 def ...
- mysql全局变量和局部变量的区别_详细讲解mysql全局变量与局部变量
通常在服务器启动时,会将每个全局变量初始化为其默认值(我们可以通过命令行或选项文件中指定的选项更改这些默认值),然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量 ...
最新文章
- Frame Buster Buster ......需要buster代码
- boost::mp11::mp_all_of_q相关用法的测试程序
- C语言*运算符和运算符
- UVA 10895——Matrix Transpose
- 内存泄露和溢出的区别_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子?...
- 双步位移求解特征值matlab,数值分析——带双步位移的QR分解求特征值算法
- 蚂蚁上市,身边又多了一堆千万富翁!
- 关于CS61b sp21中proj0的问题
- BJT与MOSFET与IGBT的区别
- 24L01/SI24R1调试笔记
- adb常用命令|修改build.porp文件
- turtle(海龟)知识点整理
- 流体机械原理及设计07
- ros实验操作——订阅者Subscriber的编程实现
- 虫师selenium3+python自动化测试电子版_Selenium3 Java自动化测试实战 第三版.pdf
- 这应该是适配安卓8.0最好的亲身列子了。。。。
- 电销机器人 | 2018年具有前景的创业项目
- python matplotlib 画DW检验图自相关图
- java-php-python-ssm网上专家门诊预约系统计算机毕业设计
- Android模拟按键