C语言中变量的作用域和生命周期

变量的类型:
1. 局部变量和全局变量
局部变量也称为内部变量。 局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再
使用这种变量是非法的。
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其
作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变
量才能使用。全局变量的说明符为 extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加
以说明。
从变量的作用域(全局作用域,局部作用域,文件作用域)(即从空间)角度来分,可以分为
全局变量(静态全局变量的作用域是该文件范围(文件作用域)
局部变量。
从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
可见生存周期只是和变量存储的位置相关。
auto变量:
函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数
据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变
量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释
放这些存储空间。这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明。
关键字 auto可以省略,auto 不写则隐含定为“自动存储类别”,属于动态存储方式。
用 static声明局部变量 :
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态
局部变量”,用关键字 static 进行声明

register变量:
为了提高效率,C 语言允许将局部变量得值放在 CPU 中的寄存器中,这种变量叫“寄存器变量”,用
关键字 register 作声明。
1) 只有局部自动变量和形式参数可以作为寄存器变量;
2) 一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
3) 局部静态变量不能定义为寄存器变量
用extern声明外部变量:
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到
本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到
文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern
对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可
以从“声明”处起,合法地使用该外部变量。
总结:
从作用域来划分分为:
- 自动变量auto,即动态局部变量(离开函数,值消失)
局部变量 - 静态局部变量static(离开函数,值还保留)
- 寄存器局部变量register(离开函数,值消失)
- 形式参数可以定义为自动变量或者register变量
- 静态外部变量(作用域只能在该文件中,文件作用域)
全局变量 - 外部变量(非静态外部变量,全局变量,可以被其它文件使用)
从变量的生存周期来分:
- 自动变量auto
动态存储 - 寄存器变量register
- 形式参数
- 静态局部变量
静态存储 - 静态外部变量
- 外部变量(全局变量)
从变量值存放的位置:
- 静态局部变量
内存中的静态存储区(全局数据区) - 静态外部变量
- 外部变量(全局变量)
- 自动变量auto
内存中的动态存储区(栈) - 形式参数
CPU中的寄存器 - 寄存器变量register
局部静态(static)变量,作用域为局部,而生命周期是全程。 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。 (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
C语言中变量的作用域和生命周期的更多相关文章
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- C语言 变量的作用域和生命周期(转)
转自 https://blog.csdn.net/u011616739/article/details/62052179 a.普通局部变量 属于某个{},在{}外部不能使用此变量,在{}内部是可以使用 ...
- 《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)
在开发一些小程序的时候,也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的. C 语言有如下 3 种作用域. 1.全局变量 在函数之外声明的变量 ...
- 详解Spring中Bean的作用域与生命周期
摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
- Spring中bean的作用域与生命周期
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...
- Spring中Bean的作用域和生命周期
作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...
- C语言中变量、全局变量与变量的作用域
什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...
- C的变量类型、作用域与生命周期的总结
C的变量类型.作用域与生命周期的总结 最近在看"C Programing Language" (Kernighan, Ritchie)关于外部变量的讨论,之前在学C的时候对这些ex ...
随机推荐
- 揭秘Socket与底层数据传输实现
揭秘socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口.但是socket在那个位置呢 ,在TCP/IP网络的四层体系和OS ...
- python基础===filter在python3中的用法
l = range(0,20) def f(x): if x%2 == 0: return True print(list(filter(f,l))) #和python2的区别在于,要加一个list
- HTML5基本标签
一.HTML5文档类型说明 二.head部分-基本标签1.<head>标签head中主要放关于网页设置的相关语句. 2.<title>标签 3.<link> ...
- 备注: ubt 16.04 安装 gtx 1060 --- 成功运行 tensorflow - gpu
---------------------------------------------------------------------------------------------------- ...
- 【leetcode】147. Insertion Sort List
Sort a linked list using insertion sort. 链表的插入排序. 需要创建一个虚拟节点.注意点就是不要节点之间断了. class Solution { public: ...
- C#基础课堂笔记
第三章:运算符和表达式 1.认识运算符:运算符又叫操作符,是一个运用于运算的符号,它作用于一个或多个操作数 运算符的分类: (1)按操作数量 一元(目)运算符 作用于一个操作数 二 ...
- 程序员从技术到项目管理PM--思维转变
对以往所做项目的经验做下总结,作为项目经理首先要对项目负责,思维要做下转变,要从项目全局角度考虑问题: 从个人成就到团队成就. 无论是做管理还是做技术,成就导向意识是优秀员工的基本素质.只有具 ...
- Vue2.0父子组件之间和兄弟组件之间的数据交互
熟悉了Vue.js的同级组件之间通信,写此文章,以便记录. Vue是一个轻量级的渐进式框架,对于它的一些特性和优点,请在官网上进行查看,不再赘述. 使用NPM及相关命令行工具初始化的Vue工程,目录结 ...
- Struts2学习笔记(五)——Action访问Servlet API
在Strut2中访问Servlet API有三种方式: 1.通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API. 步骤: 1 ...
- BotVS开发基础—2.5 绘制图表
代码 import time import math def main(): chart = { # 用于初始化 图表的对象 'title': {'text': "line数值触发 plot ...