- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第10周第1次课 总第20次课
课题:变量的存储与作用域
教学目标:
掌握变量的存储类型与作用域
教学重点:
存储类型及作用域
教学难点:
存储类型及作用域
教学方法:
讲授法
教学过程:
【导入新课】
函数是C++程序的基本模块。通常我们将一些功能相对独立的或经常使用的操作或运算抽象出来,定义为函数,这些函数可以被重复使用,使用时只要考虑其功能和使用接口即可。在结构化程序设计中,函数是将任务进行模块划分的基本单位,这些模块可以分别单独设计调试并协作完成整个任务。而在面向对象的程序设计中,类中所封装的操作也是用函数进行描述的,因此函数在C++程序中具有非常重要的意义。要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量的生命期和作用域。
【教学内容】
4.3 全局变量和局部变量
程序中的变量由于定义的位置不同,在程序中的可见程度是不一样的,有些变量在整个程序中都是可见的,称为全局变量;有些变量只在某些区域中可见,称为局部变量。所谓可见,指的是定义的这个变量可以被使用。要了解变量的这些属性,必须先了解变量的存储机制。
4.3.1 变量的存储机制与C++的内存布局
操作系统为一个C++程序的运行所分配的内存分为四个区域,如图4.3所示:
堆区
(动态数据) 栈区
(函数局部数据) (main()函数局部数据) 全局数据区
(全局变量、静态变量) 代码区
(程序代码) 图4.3 程序在内存中的区域
(1)代码区:存放程序代码,即程序中各个函数的代码块;
(2)全局数据区:存放全局数据和静态数据;分配该区时全部内存清零。
(3)栈区:存放局部变量,如函数中的变量等;分配栈区时内存不处理。
(4)堆区(heap):存放与指针相关的动态数据。分配堆区时内存不处理。
栈(stack)是一种先进后出的数据结构,原理类似子弹匣,最先压入弹匣的子弹最后一个弹出。局部变量在程序执行过程中动态地获得和释放栈空间。变量获得栈空间称为变量入栈;而这些变量占据的栈空间被释放称为变量出栈。变量出栈的顺序与入栈的顺序相反,即最先分配单元的变量空间最后一个被释放。关于栈的具体内容将在动态内存分配一章中介绍。
4.3.2 全局变量
定义在函数之外的变量称为全局变量。全局变量存放在全局数据区,如果用户在定义时不显式给出初始化值,因全局数据区分配时已将全部内存清零,所以其初始化值全0。全局变量可定义在程序开头,也可定义在中间位置,该全局变量在定义处之后的任何位置都是可以访问的,称为可见的。如果程序由多个函数组成,其中任何一个函数修改全局变量,其他函数都将看到这个修改的结果。
【例4.5】 多个函数使用全局变量的例子。
#includeiostream.h
int n=100;
void func(){
n*=2;
}
void main(){
n*=2;
coutnendl;
func();
coutnendl;
}
运行结果:
200
400
4.3.3 局部变量
迄今为止,程序中所用到的绝大多数变量都是定义在函数内的,包括定义在主函数内,这些变量称为局部变量。此外,定义在块中的变量也属于局部变量。C++默认局部变量为自动类型,定义时用auto修饰,但通常auto缺省。局部变量存储在栈中,它们不是在编译时建立,而是当程序执行到函数或块时,才会为其中定义的局部变量分配存储空间;当函数执行完毕返回时,这些局部变量占用的空间会按照先进后出的顺序被依次释放掉。如不对局部变量显式初始化,则其值为随机数。
【例4.6】 使用局部变量的例子。
#includeiostream.h
void fun(){
auto int t=5; // fun()中的局部变量,auto可省略
coutfun()中的t=tendl;
}
void main(){
float t=3.5; //main()函数中的局部变量
coutmain()中的t=tendl;
fun();
coutmain()中的t=tendl;
}
运行结果:
main()中的t=3.5
fun()中的t=5
main()中的t=3.5
上例显示不同函数中可以使用同名的局部变量,这些同名变量不会相互冲突。下面的函数调用机制将说明其中的原因。
4.4 函数调用机制
局部变量不是在编译时分配存储单元的,而是在函数调用发生时才分配单元,而当函数返回时这些局部变量的单元又自动释放。这种自动地获得和释放存储单元是用栈实现的。每当函数调用发生时编译系统都会做以下工作:
(1)建立栈空间;
(2)保护现场:将当前主调函数的执行状态和返回地址保存在栈中;
(3)为被调函数中的局部变量(包括形参)分配栈空间,并将实参值传递给形参;
(4)控制权交
文档评论(0)