7.7 变量的存储类别、作用域及生存期

1.变量的存储类别

在C语言中,有两类存储类别:自动类别及静态类别。

有4个与两种存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)和extern(外部),这些说明符一般与类型说明一起出现,一般放在类型名的左边,例如:

auto long I,j;

也可写成:

long auto I,j;

(1)自动变量:自动变量是C程序中使用最多的一种变量,这种变量的建立和撤消都是在系统中自动进行的。

格式:[auto]数据类型 变量名[=初始化表达式],…;

上面的说明格式中,方括号中是可省略的部分,auto为自动类别标识符,若省略auto,系统缺省的存储类别也为自动类别。

注意:函数的形参也为自动类别,在定义时不必加存储类别标识符。

(2)寄存器变量:寄存器变量与自动变量的性质相同,其区别只在于存储的位置不同,寄存器变量存储在CPU的寄存器中,而自动变量存储在内存中的动态存储区,寄存器变量的存取速度要快些。

格式:register数据类型,变量名[=初始化表达式],…;

上面的说明格式中,register为寄存器变量的存储类别标识符。

说明:

①CPU中寄存器的数目是有限的,因此只能把少数的变量说明为寄存器变量;

②寄存器变量是存放在寄存器中的,而不是存放于内存中,所以,寄存器变量无地址;

③寄存器变量的说明应尽量放在靠近要使用的地方,用完后尽快释放,这样可提高使用效率。

(3)静态变量:静态类别变量的存储空间在程序的整个运行期间是固定的。

格式:static数据类型 变量名[=初始化表达式],…;

在上面的说明格式中,static为静态变量的存储类别标识符。

静态变量的初始化在编译时进行,定义时可用常量或表达式进行显式初始化。对于没有初始化的静态变量,自动初始化为0(整型)或0.0(实型)。

注意:静态变量具有可继承性,这与自动变量有所不同。

(4)外部变量:使用extern可使外部变量使用范围扩充到需要使用它的函数。外部变量可作显式的初始化,若不作初始化,系统将自动地初始化为0或0.0。

格式:[extern]数据类型,变量名[=初始化表达式],…;

上面的说明格式中,extern使外部变量的作用范围扩大到其他源程序文件中。

注意:局部变量既可以说明为自动类别,也可以说明为静态类别;全局变量只能说明为静态类别。

2.变量的作用域及生存期

在C语言中,变量必须先说明后使用,在程序中一个已定义的变量的使用范围就是此变量的作用域。经过赋值的变量在程序运行期间能保持其值的时间范围为该变量的生存期。

(1)局部变量的使用域及生存期

①自动变量的使用域及生存期

自动变量的存储单元被分配在内存的动态存储区,每当进函数体(或复合语句)时,系统自动为自动变量分配存储单元,退出时自动释放这些存储单元。自动变量的作用域为从定义的位置起,到函数体(或复合语句)结束为止。

自动变量在进入到定义它们的函数体(或复合语句)时生成,在退出所在的函数体(或复合语句)时消失,这就是自动变量的生存期。

使用自动变量的优点是使各函数之间造成信息分隔,不同函数中使用同名变量时不会相互影响。

②寄存器变量的使用域及生存期

寄存器变量的使用域及生存期与自动变量相同。

③静态存储类别的局部变量

在函数体(或复合语句)内部,用static说明的变量静态存储类别的局部变量,这种变量的作用域与自动(或寄存器)变量的作用域相同,但是生存期有所不同。

在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久的存储单元,甚至在退出函数后下次再进入函数时,静态局部变量仍使用原来的存储单元。由于不释放存储单元,所以这些存储单元中的值将会被保留下来。静态局部变量的生存期将一直延长到程序运行结束。

静态局部变量适合于在函数调用之间必须保留局部变量值的独立变量。

(2)全局变量的作用域及生存期

全局变量的作用域为从变量定义的位置开始,到整个源程序文件结束为止。生存期为整个程序的运行期间。

注意:全局变量在整个程序运行期间都占用内存空间。全局变量必须在函数以外定义,因而降低了函数的通用性,影响函数的独立性。使用全局变量时,当全局变量的值意外改变时,会引起副作用,这种错误一般难以查找。

①在同一编译单位内用extern标识符来扩展全局变量的作用域

当全局变量定义后,在引用函数前,应在引用它的函数中用extern对此全局变量进行说明,以便使编辑程序确定此外部变量已被定义,不必再为它分配存储单元,此时的作用域从extern说明开始,到此函数结束。

注意:全局变量的定义只能出现一次,这时不可使用extern标识符。如果多次引用全局变量,这时必须用extern标识符。

②在不同编译单位内用extern标识符来扩展全局变量的作用域

C语言中的不同函数可以存放在不同的源程序文件中,每个源程序文件可以单独进行编译,进行语法检查,再生成目标文件,最后用系统提供的连接程序把多个目标文件连接成一个可执行程序。

当程序由多个源程序文件组成时,若每个文件中都要引用同一个全局变量,这时如在每个源程序文件中都定义一个所需的同名全局变量,将在连接时产生重复定义错误。解决的办法是在其中一个源程序文件中定义所有全局变量,而在其他用到全局变量的源程序文件中用extern对这些变量进行说明,以表明它们已在其他编译单元中被定义。

③静态全局变量

当用static标识符说明全局变量时,全局变量为静态全局变量。静态全局变量只能在定义它的源程序文件中使用,不能被其他源程序文件使用。

2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期.doc

下载Word文档到电脑,方便收藏和打印[全文共2423字]

编辑推荐:

下载Word文档

c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...相关推荐

  1. c语言6字符宽度和小数位数,2017年计算机二级C语言考点复习

    2017年计算机二级C语言考点复习 古话说得好"读书破万卷,下笔如有神",只有积累了一定的经验,才可能提炼出思维的规律,下面是百分网小编为大家整理的2017年计算机二级C语言考点复 ...

  2. 关于C语言逻辑值的说法错误的是( ),2017年计算机二级c语言题库及答案

    2017年计算机二级c语言题库及答案 [选择题] 1). 关于C语言的变量,以下叙述中错误的是( ) A.所谓变量是指在程序运行过程中其值可以被改变的量 B.变量所占的存储单元地址可以随时改变 C.程 ...

  3. 计算机二级c语言考点解析,2017年计算机二级C语言考点解析

    2017年计算机二级C语言考点解析 C语言是一个有结构化程序设计.具有变量作用域(variable scope)以及递归功能的过程式语言.下面是小编整理的关于计算机二级C语言考点解析,希望大家认真阅读 ...

  4. 非计算机专业二级c语言,2017年计算机二级C语言基本知识

    2017年计算机二级C语言基本知识 为了帮助大家更加深入地了解C语言,今天yjbys考试网小编为大家整理了2017年计算机二级C语言基本知识,供考生参考.更多计算机等级考试相关信息请关注应届毕业生计算 ...

  5. 计算机二级c在哪里学习,2017年计算机二级C语言考点学习

    2017年计算机二级C语言考点学习 学习是把知识能力思维方法等转化为你的私有产权的重要手段,是"公有转私"的重要途径.以下是百分网小编整理的2017年计算机二级C语言考点学习,欢迎 ...

  6. 计算机二级c语言程序设计改错,2017年计算机二级C语言上机改错题考点总结

    2017年计算机二级C语言上机改错题考点总结 对上机考试改错题的做题方法和总结,改错题的错误主要分为以下几类: 1.if或while语句 若错误行是if或者while语句,则要注意以下点: 1)首先判 ...

  7. c语言乘积imnl,2017年计算机二级C语言考前必做试题及答案2

    (21)有以下程序: 程序运行后的输出结果是( ). A.852 B.963 C.741 D.875421 (22)有以下程序: 程序运行后的输出结果是( ). A.let=4 B.m=2 C.m=6 ...

  8. 2017计算机二级c语言试题,2017年计算机二级C语言试题

    2017年计算机二级C语言试题 A)运行错误 B)100 c)i的地址 D)j的地址 (52)B 知识点:指针变量的引用 评析:j=&i,j的值就是i的地蚍,*j=100,将j的地址赋给k,这 ...

  9. c语言常量2l是什么,2017年计算机二级c语言题库

    2017年计算机二级c语言题库 通过本课程的学习,使学生更好地了解和应用计算机,培养学生应用计算机独立解决问题的能力,为学生今后进一步的学习奠定良好的.扎实的计算机语言基础.yjbys小编整理了一些关 ...

最新文章

  1. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
  2. Python中str.replace()的使用方法
  3. 8086地址传送指令LDS,LES
  4. windows下mongodb的安装与配置
  5. VirtualBox通过命令方式批量创建并配置虚拟机
  6. JavaScript闭包的底层运行机制
  7. [蓝桥杯][2015年第六届真题]表格计算(递归+记忆化)
  8. 传送,条件加速 Learn Unreal Engine (with C++)
  9. 惯性制导精度是多少_美军激光炸弹真实精度性能:炸小卡车,直接从驾驶员车窗钻进去炸...
  10. 为什么python的命名不能以数字开头,Python模块名称以数字开头
  11. 【codevs1519】 过路费
  12. 启动数据库时提示ORA-03113: 通信通道的文件结尾解决方法
  13. Flutter 模拟神舟十三号火箭发射动画
  14. Nmap扫描和识别服务
  15. CentOS 添加微软雅黑字体
  16. 多人的证件照放在一张纸上怎么排版
  17. 2022社群扫码进群活码完整系统源码+修复版的
  18. TiDB+TiSpark部署--安装,扩缩容及升级操作
  19. 项目部署六---阿里云申请免费ssl证书并安装
  20. Python实现斗地主

热门文章

  1. iOS Sprite Kit教程之编写程序以及Xcode的介绍
  2. python appium 并行多设备_学会使用python启动多个appium server,然后获取多台设备的driver...
  3. python多线程同步与互斥_Python之多线程:线程互斥与线程同步
  4. python读取nii文件_python实现批量nii文件转换为png图像
  5. modbus从站模拟软件_这些操作软件都不知道?趁早别当电气人了
  6. python编程单词排序_python 统计单词个数,并按个数与字母排序
  7. Python-EEG工具库MNE中文教程(14)-Epoch对象中的元数据(metadata)
  8. [unreal4入门系列之十五] UE4中的动态数组:TArray容器
  9. 英特尔溢价4倍收购还遭拒!RISC-V芯片公司SiFive说想独立上市
  10. 一群工程师,让听障群体“看见”了声音