欢迎来到天天文库
浏览记录
ID:5503507
大小:309.50 KB
页数:25页
时间:2017-11-16
《(c++课件)4章 变量作用域第(函数2)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、4.3全局变量和局部变量4.3.1变量的存储机制与C++的内存布局4.3.2全局变量4.3.3局部变量4.3.1变量的存储机制与C++的内存布局自由存储区(动态数据)操作系统为一个C++程序的运行所分配的内存分为四个区域,如图4.3所示:栈区(函数局部数据)全局数据区(全局、静态)代码区(程序代码)(main()函数局部数据)自由存储区(动态数据)存储区域说明:(1)代码区(Codearea):存放程序代码,即程序中各个函数的代码块;(2)全局数据区(Dataarea):存放全局数据和静态数据;分配该区时内存全部清零,结果变量的所有字节等效初始化为全0。(3)栈区(Stackarea)
2、:存放局部变量,如函数中的变量等;分配栈区时不处理内存,即变量取随机值。(4)自由存储区(Freestorearea):存放与指针相关的动态数据。分配自由存储区时不处理内存。4.3.1变量的存储机制与C++的内存布局4.3.2全局变量在所有函数之外定义的变量称为全局变量。全局变量存放在全局数据区,因编译器自动将该区清为全0,如果用户在定义时不显式给出初始化值,则等效初始化为全0。全局变量可定义在程序开头,也可定义在中间位置,该全局变量在定义处之后的任何位置都是可以访问的,称为可见的。【例4.5】多个函数使用全局变量的例子。全局变量引入:4.3.2全局变量【例4.5】打印200调用fun
3、c()函数func()200*2=400打印400n=100n=100*2=200【例4.5】多个函数使用全局变量的例子。intn=100;voidfunc(){n*=2;}intmain(){n*=2;cout<4、【例4.6】使用局部变量的例子。4.3.3局部变量打印main()中的t=4.5调用fun()函数fun()打印fun()中的t=5打印main()中的t=4.5t=4.5t=5【例4.6】使用局部变量的例子。voidfun(){autointt=5;//fun()中的局部变量,auto可省略cout<<"fun()中的t="<5、占用的内存是在程序执行过程中“动态”地建立和释放的。这种“动态”是通过栈由系统自动管理进行的。(1)建立栈空间;(6)恢复现场:取主调函数运行状态及返回地址,释放栈空间;(7)继续主调函数后续语句。(5)释放被调函数中局部变量占用的栈空间;(4)执行被调函数函数体;(3)为被调函数中的局部变量分配空间,完成参数传递;(2)保护现场:主调函数运行状态和返回地址入栈;调用过程:4.4函数调用机制voidfun1(int,int);voidfun2(float);intmain(){intx=1;y=2;fun1(x,y);returno;}voidfun1(inta,intb){float6、x=3;fun2(x);}voidfun2(floaty){intx;…}x栈顶栈底y3fun2()fun1()运行状态及返回地址x3b2a1fun1()main()运行状态及返回地址y2x1main()操作系统运行状态及返回地址此图例说明在程序执行过程中怎样通过栈“动态”地建立和释放局部变量占用的内存的4.5作用域与标识符的可见性3文件域2函数声明域作用域:指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。本节重点讨论局部域和文件域(全局域),其中局部域包括块域和函数声明域。任何标识符作用域的起始点均为标识符说明处。下面分别介绍:1块域函数中定义的标识符,包括形7、参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。块域块指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。复合语句是一个块。函数也是一个块。复合语句中定义的标识符,作用域仅在该复合语句中。【例4.7】输入两数,按从大到小的顺序保存。块的引入:块域【例4.7】a=3b=535a=3b=5a=5b=3【例4.7】输入两数,按从大到小的顺序保存,并输出结果。结果栈t=3intmain(){inta,b;//具有函数域cout<<
4、【例4.6】使用局部变量的例子。4.3.3局部变量打印main()中的t=4.5调用fun()函数fun()打印fun()中的t=5打印main()中的t=4.5t=4.5t=5【例4.6】使用局部变量的例子。voidfun(){autointt=5;//fun()中的局部变量,auto可省略cout<<"fun()中的t="<5、占用的内存是在程序执行过程中“动态”地建立和释放的。这种“动态”是通过栈由系统自动管理进行的。(1)建立栈空间;(6)恢复现场:取主调函数运行状态及返回地址,释放栈空间;(7)继续主调函数后续语句。(5)释放被调函数中局部变量占用的栈空间;(4)执行被调函数函数体;(3)为被调函数中的局部变量分配空间,完成参数传递;(2)保护现场:主调函数运行状态和返回地址入栈;调用过程:4.4函数调用机制voidfun1(int,int);voidfun2(float);intmain(){intx=1;y=2;fun1(x,y);returno;}voidfun1(inta,intb){float6、x=3;fun2(x);}voidfun2(floaty){intx;…}x栈顶栈底y3fun2()fun1()运行状态及返回地址x3b2a1fun1()main()运行状态及返回地址y2x1main()操作系统运行状态及返回地址此图例说明在程序执行过程中怎样通过栈“动态”地建立和释放局部变量占用的内存的4.5作用域与标识符的可见性3文件域2函数声明域作用域:指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。本节重点讨论局部域和文件域(全局域),其中局部域包括块域和函数声明域。任何标识符作用域的起始点均为标识符说明处。下面分别介绍:1块域函数中定义的标识符,包括形7、参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。块域块指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。复合语句是一个块。函数也是一个块。复合语句中定义的标识符,作用域仅在该复合语句中。【例4.7】输入两数,按从大到小的顺序保存。块的引入:块域【例4.7】a=3b=535a=3b=5a=5b=3【例4.7】输入两数,按从大到小的顺序保存,并输出结果。结果栈t=3intmain(){inta,b;//具有函数域cout<<
5、占用的内存是在程序执行过程中“动态”地建立和释放的。这种“动态”是通过栈由系统自动管理进行的。(1)建立栈空间;(6)恢复现场:取主调函数运行状态及返回地址,释放栈空间;(7)继续主调函数后续语句。(5)释放被调函数中局部变量占用的栈空间;(4)执行被调函数函数体;(3)为被调函数中的局部变量分配空间,完成参数传递;(2)保护现场:主调函数运行状态和返回地址入栈;调用过程:4.4函数调用机制voidfun1(int,int);voidfun2(float);intmain(){intx=1;y=2;fun1(x,y);returno;}voidfun1(inta,intb){float
6、x=3;fun2(x);}voidfun2(floaty){intx;…}x栈顶栈底y3fun2()fun1()运行状态及返回地址x3b2a1fun1()main()运行状态及返回地址y2x1main()操作系统运行状态及返回地址此图例说明在程序执行过程中怎样通过栈“动态”地建立和释放局部变量占用的内存的4.5作用域与标识符的可见性3文件域2函数声明域作用域:指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。本节重点讨论局部域和文件域(全局域),其中局部域包括块域和函数声明域。任何标识符作用域的起始点均为标识符说明处。下面分别介绍:1块域函数中定义的标识符,包括形
7、参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。块域块指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。复合语句是一个块。函数也是一个块。复合语句中定义的标识符,作用域仅在该复合语句中。【例4.7】输入两数,按从大到小的顺序保存。块的引入:块域【例4.7】a=3b=535a=3b=5a=5b=3【例4.7】输入两数,按从大到小的顺序保存,并输出结果。结果栈t=3intmain(){inta,b;//具有函数域cout<<
此文档下载收益归作者所有