四章节C程序结构.ppt

上传人:本田雅阁 文档编号:3208455 上传时间:2019-07-31 格式:PPT 页数:24 大小:216.05KB
返回 下载 相关 举报
四章节C程序结构.ppt_第1页
第1页 / 共24页
四章节C程序结构.ppt_第2页
第2页 / 共24页
四章节C程序结构.ppt_第3页
第3页 / 共24页
四章节C程序结构.ppt_第4页
第4页 / 共24页
四章节C程序结构.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《四章节C程序结构.ppt》由会员分享,可在线阅读,更多相关《四章节C程序结构.ppt(24页珍藏版)》请在三一文库上搜索。

1、第四讲 C+程序的结构,C+语言程序设计,2,本章主要内容,变量的类型 作用域与可见性 文件结构与编译预处理命令 名字空间,6.1 变量的作用域,除了按数据类型区分变量外,根据变量定义的位置,可以把变量分成全局变量与局部变量。全局变量是指定义在函数体外部的变量,它能被所有函数使用。局部变量是指定义在函数或复合语句中的变量,只能在函数或复合语句中使用。,4,变量的存储类型,auto存储类 属于一时性存储,其存储空间可以被若干变量多次覆盖使用。 register存储类 存放在通用寄存器中。 extern存储类 在所有函数和程序段中都可引用。 static存储类 在内存中是以固定地址存放的,在整个程

2、序运行期间都有效。,运行结果: in p1 G=11 in p2 G=22 in p2 g=222 in p G=22 in p g=222,运行结果: m=1 n=1 m=1 n=2 m=1 n=3 m=1 n=4,6.1.2 变量的存储类型,static型变量,7,可执行程序的结构,代码区(text segment) 存放CPU执行的机器指令(machine instructions) 代码区是只读的 规划了局部变量的相关信息 全局数据区静态数据区 包含了程序中 已初始化的全局变量、已初始化的静态变量(全局、局部) 常量数据(如字符串常量) 常变量,8,进程的结构,如果将某个可执行文件加载

3、到内存运行,则将成为一个进程,栈区,堆区,已初始化全局变量 静态变量和常量数据,数据区,可执行代码,代码区,初始化全局变量 静态变量和常量数据,可执行代码,可执行文件结构,数据区,代码区,进程结构,6.1.3 变量在内存中的存储,当一个程序准备运行时,操作系统会为程序分配一块内存空间,C+程序的内存通常被分为四个区: 全局数据区(data area) 代码区(code area) 栈区(stack area) 堆区(heap area) 全局变量、静态变量、字符串常量、常变量存放在全局数据区;所有的函数和代码存放在代码区;为运行函数而分配的函数参数、局部变量、返回地址存放在栈区;堆区用于动态内

4、存分配。 变量的生存期为从产生到消失的时期。全局变量、静态变量、常变量生存周期为整个程序的生存周期,因此称为静态生存期;局部变量的生存周期起于函数调用,结束于函数调用结束,其生存期是动态的,因此称为动态生存期。,注意: 堆空间不是系统为程序自动分配的,它是程序执行过程中由new语句为变量申请的。即使指向堆空间的指针变量消失,new语句申请的空间也不会消失。new语句申请的空间由delete语句释放。对应于C语言的malloc语句,6.1.3 变量在内存中的存储,常变量(常量)、全局变量、局部静 态变量、字符串常量在程序运行前 在数据区进行分配。并且依次按照 常变量、全局变量、局部静态变量 的顺

5、序从低地址向高地址分配。常 变量按定义的先后次序分配,全局 变量、局部变量也一样。,Adddress of parameter variable: &i=0013FF2C &j=0013FF30 Adddress of local variable: &k=0013FF20 &p=0013FF1C &m=0013FF18 Adddress of static local variable: &l=0047773C,Address of heap: 00480410 /释放堆空间前指针的值 before delete p=ABCDEFGHIJ /释放堆空间前堆中的内容 after delete:

6、 00480410 /释放堆空间后指针的值不变 p=葺葺葺葺葺葺葺? /释放堆空间后,堆中的内容无意义,void main() L1: fun(); L2: cout “Adddress of global variable:“ endl; cout “ ,Adddress of global variable: &i=0046C01C &j=0046C020 &k=00474DC0 Address of function: &fun=004010A0 &main=0040123F,6.1.3 变量在内存中的存储,12,6.2 作用域与可见性,作用域 一个标识符在程序正文中有效的区域。 块作用

7、域(局部作用) 类作用域 文件作用域 可见性 从对标识符引用的角度看变量的有效范围。,13,块作用域,在块( 标记的一段程序单元)中声明的标识符,其作用域自声明处起,限于块中,例如: void fun(int a) int b; cin b; if (b 0) int c; ,作用域与可见性,14,类和文件作用域,类作用域作用于特定的成员名,类及其对象有特殊的访问和作用域规则。 不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。,作用域与可见性,程序实例,15,可见性的概念,可见性是从对标识符的引用的角度来谈的概念。 可见性表示从内层作用域向外

8、层作用域“看”时能看见什么。 如果标识在某处可见,则就可以在该处引用此标识符。,作用域与可见性,16,可见性的一般规则,标识符应声明在先,引用在后。 在同一作用域中,不能声明同名的标识符。 对于两个嵌套的作用域,如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。 对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。,作用域与可见性,17,例,#include int i; /文件作用域 int main() i = 5; int i; /块作用域 i = 7; cout “i=“ i endl; /输出7

9、cout “i=“ i ; /输出5 return 0; ,作用域与可见性,返 回,18,例2 块作用域对象的生存期,#include void fun(); void main() fun(); fun(); void fun() static int a = 1; int i =5; a+; i+; cout “i=“ i “,a=“ a endl; ,i,a均为块作用域 i是动态生存期 a是静态生存期 运行结果: i=6, a=2 i=6, a=3,对象的生存期,19,变量的生存期与可见性,全局变量 具有静态生存期。 静态局部变量 有全局寿命,局部可见。 只第一次进入函数时被初始化。 一

10、般局部变量 具有动态生存期。 每次进入函数时都初始化。,对象的生存期,20,数据与函数,数据存储在局部对象中,通过参数传递实现共享函数间的参数传递。 数据存储在全局对象中。 将数据和使用数据的函数封装在类中。,#include int global; void f() global = 5; void g() cout global endl; ,int main() f( ); g( ); /输出“5” return 0; ,返 回,例 函数间数据共享,22,模块化程序设计,将一个程序分解成若干模块,分别放在几个源文件中,形成一个项目(Project) 可以对每个源文件单独进行编译,再将它们

11、的目标代码连同标准函数库中的函数链接在一起,形成可执行文件 当一个文件中的代码被修改后,不必对所有程序重新编译,从而节省了程序的编译时间 使程序更易于维护,给多个程序员共同编制一个大型项目提供了方便,23,模块,模块的构成 扩展名为.h的头文件 函数的原型声明,功能接口的描述 全局变量的声明, 加上extern关键字,说明这个变量的内存是在其他模块分配的。 宏定义 扩展名为.cpp的源文件 定义全局变量并进行相应的初始化 定义函数,功能的实现细节 模块之间通过相互调用函数和共享全局变量联系起来,头文件是联系的纽带。 模块全局变量,仅供本模块的调用者使用的函数和全局变量,需要在定义它们时加上static关键字,24,实例,用scanf( )可以读入用户输入的整数或浮点数。但是在输入时,它并不限制字符类型。在输入整数时,如果用户输入了字母或符号,scanf( )将报错。 如果设计一个模块,限制在输入整数和浮点数时只可以输入合法的数字、正负号和小数点,其余的字符都忽略。 这个模块就可应用于所有需要输入整数和浮点数的程序。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1