- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章C语言与程序设计补遗讲解
9.1 变量的存储类别与生命期 1. 生命期的概念 从变量生命期(即由创建到撤消)来分,可以将变量分为静态存储变量和动态存储变量两类: (1) 静态存储变量:在程序运行时固定分配存储空间的变量。 (2) 动态存储变量:在程序运行中根据需要动态分配存储空间的变量。 程序运行时对应的内存分配示意如图9-1所示。 图9-1 程序运行时对应的内存分配示意 全局变量和静态局部变量(static变量)存放在静态数据区,程序开始执行时给它们分配内存单元,程序执行结束时再释放这些内存单元。也即在程序的整个执行过程中这些变量都存在(有自己的内存单元),它们的生命期为程序的整个执行过程。 动态数据区存放自动局部变量、形参变量和用于中断现场的保护数据。自动局部变量是指未加staic声明的局部变量;形参变量是指函数的形参。在函数调用时为自动局部变量和形参变量在动态数据区分配内存单元,当函数执行结束时释放这些内存单元。也即在函数的整个执行过程中这些变量都存在,它们的生命期为函数的整个执行过程。 在C语言中,每个变量都有两个属性:数据类型和数据的存储类别。前面各章节中,我们在定义变量时只涉及它的数据类型,其实还可以定义变量的存储类别,它决定这个变量的存放位置(是静态数据区还是动态数据区)和生命期。 变量定义的一般形式如下: [存储类别] 类型标识符 变量名; 其中,方括号“[ ]”中的内容为可选项。 C语言中的变量可以有4种存储类别:自动变量、寄存器变量、静态变量和外部变量,分别用存储类别auto、register、static和extern。下面仅对自动变量、寄存器变量和静态变量进行介绍。 2. 自动变量 在函数体内或复合语句内定义变量时,如果没有指定存储类别或使用了“auto”存储类别,则系统都认为所定义的变量为自动局部变量,简称为自动变量。此外,函数首部中的形参也是自动变量。例如: auto int a=2,b; int a=2,b; 上述两种定义方法是等价的,即都定义了a和b为自动变量。每当进入函数体或复合语句时,系统在动态数据区为自动变量分配临时内存单元,退出时自动释放这些内存单元;再次进入函数或复合语句时,系统又为它们重新分配临时内存单元,退出时又自动释放这些内存单元。因此,释放后自动变量的值不可能保留,这类变量的作用域及生命期只存在于定义它的函数体内或复合语句内。 自动变量在动态数据区分配内存单元,并随着程序的运行可能不断释放和重新分配内存单元,也即这个内存单元的位置是不固定的,因此自动变量中的值也会随之改变。所以,自动变量在使用之前必须赋值,否则它的值是不确定的。此外,在不同函数中使用的同名自动变量也不会相互影响。 例9.1 分析下面程序的运行结果。 #includestdio.h void fun(); void main() { fun(); fun(); } void fun() { int n=2; /*自动变量*/ n++; printf(n=%d\n,n); } [解] 在程序中,函数fun中定义的n为自动变量,其作用域只在函数fun内。第一次调用fun时,为n分配临时内存单元且n的初值为2,执行“n++;”后n值为3,因此输出结果为3;第一次调用fun结束,此时分配给n的内存单元被释放。第二次调用fun时,又为n重新分配了内存单元,函数fun的执行过程与第一次一样,因此输出的结果仍是3。程序执行的动态图如图9-2所示。 图9-2 程序执行的动态图 程序执行后的输出结果为: n=3 n=3 3. 寄存器变量 寄存器变量也是自动变量,它与一般自动变量的区别在于,寄存器变量的值是存储于CPU内的寄存器中,而一般的自动变量则存储于内存中。由于从寄存器中读取数据要比从内存中读取数据的速度快,所以为了提高运算速度,可以将一些频繁使用的局部变量或形参变量定义为寄存器变量。寄存器变量只要在定义时加上存储类别register即可。例如: register int a; 使用寄存器变量时要注意以下几点: (1) 寄存器变量本身是一个自动变量,因此只有函数内定义的变量或形参才可以定义为寄存器变量。 (2) ?CPU中的寄存器个数有限,所以只能将少数的变量定义为寄存器变量。 (3) 受寄存器长度的限制,寄存器变量只能是char、int和指针类型的变量。 (4) 由于寄存器变量是保存在CPU的寄存器中而不是保存在内存中,因此不能进行取地址运算。 (5) 在调用函数时,函数中的寄存器变量才占用寄存器存放其值,当函数调用结束时就释放寄存器,也即寄存器变量消失。 例9.2 编写求n!?的
您可能关注的文档
最近下载
- 初中道德与法治新人教版七年级上册全册教案(2024秋).pdf VIP
- 2025年无犯罪记录证明申请表申请书(模板).docx VIP
- 《新媒体营销基础》课件——新媒体营销概述.pptx VIP
- 项目计划进度管理流程图.pdf VIP
- 2024广播电视播音员主持人考试历年机考真题集附答案详解【考试直接用】.docx VIP
- 200MWh储能电站安全预评价报告.doc VIP
- 华为经营管理-华为的流程管理(6版).doc VIP
- 2015-2020年一建历年真题-水利.pdf VIP
- 平行文本在翻译中的运用.ppt VIP
- 口腔医疗行业市场规模增长与竞争格局分析报告:2025年市场展望.docx
文档评论(0)