E7%AB%A0名词的空间域、时间域和物理存储位置.ppt_第1页
E7%AB%A0名词的空间域、时间域和物理存储位置.ppt_第2页
E7%AB%A0名词的空间域、时间域和物理存储位置.ppt_第3页
E7%AB%A0名词的空间域、时间域和物理存储位置.ppt_第4页
E7%AB%A0名词的空间域、时间域和物理存储位置.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、空间域:一个类型或量值,从程序的什么位置到什么位置是有效的,是可以引用的,是占据内存的。 时间域:一个类型或量值,在程序执行过程中,从什么时刻开始到什么时刻是占据内存的。,第6章名词的空间域、时间域和物理存储位置,名词的空间域和时间域不完全一致。 有空间域的类型或量值,一定有时间域。即在程序的某位置可以访问的类型或量值,此时一定占据内存; 有时间域的类型或量值,不一定有空间域。即有的时候,程序执行到某个位置,某个类型或量值虽然占据内存,但无法访问,即在该位置不可见。,6.1 C/C+程序的逻辑结构,程序从小到大可分为如下逻辑单位: 语句(statement):分号结束 2.模块(block):

2、 一对花括号括起的若干语句。 3.嵌套模块: 多对花括号的嵌套。,4.文件(file): 程序的存盘单位。文件中通常包含多个模块(或嵌套模块),每个模块内包含多个语句。 5.工程(project): 工程是功能单位,是对多个文件进行组织和管理的框架。同一个工程内的文件之间可以交换数据,共享函数。 6.工作区(workspace): 工作区是VC+最大的开发单位,是对多个工程进行组织和管理的框架。一个工作区内的多个工程应该是相关的。不同工程间可以共享文件。,图6. 1 C/C+程序逻辑结构,6.2名词性的类型和量值在各逻辑结构上的空间域,6.2.1模块域 模块 是空间作用域的最小范围。 缺省情况

3、下,定义在模块内(一对花括号内)的类型和量值,其有效范围是从定义位置到本模块结束。出本模块右花括号后,该类型或量值因为释放内存空间而失效,无法访问。,例6. 1 量值模块作用域的验证 #include int fun(int x) void main() int a=10; int b; printf(a= %dn,a); b=fun(a); printf(a= %d, b= %dn, a, b); ,调用fun函数,a(10)为实参,fun函数的声明,int fun(int x) int a=20; printf(a= %d, x= %dn, a, x); return a+x; ,fun内

4、定义的a只在fun内有效,返回a+x的值(20+10),a= 10 a= 20, x= 10 a= 10, b= 30 Press any key to continue,main()中的输出,fun()中的输出,main()中的输出,例6. 1 量值模块作用域的验证 #include int fun(int x) void main() int a=10; int b; printf(a= %dn,a); b=fun(a); printf(a= %d, b= %dn, a, b); printf(“x= %dn, x); ,调用fun函数,a(10)为实参,fun函数的声明,编译出错:err

5、or C2065: x : undeclared identifier,int fun(int x) int a=20; printf(a= %d, x= %dn, a, x); printf(b= %dn, b); return a+x; ,fun内定义的a只在fun内有效,返回a+x的值(20+10),编译出错:error C2065: b : undeclared identifier,例6. 2 类型模块作用域的验证 #include Person fun(); Person fun() struct Person int id; char name10; ZS=1, 张三; retu

6、rn ZS; void main() Person LiSi; LiSi=fun(); ,fun内定义的类型Person,只在fun内有效,在main函数内声明一个在fun函数内定义的Person类型的变量LiSi,编译出错,声明Person类型的变量ZS,并赋值,例6. 2 类型模块作用域的验证 #include struct Person int id; char name10; ; Person fun(); void main() Person LiSi; LiSi=fun(); printf(id=%dn,LiSi.id ); printf(name=%sn,LiS );

7、 Person fun() Person ZS=1, 张三; return ZS; ,id=1 name=张三 Press any key to continue,6.2.2嵌套模块的层域 当一个模块内嵌套另一个模块时,定义在内层模块的类型和量值的空域就是内层模块; 定义在外层模块内的类型和量值的空域是外层模块,当然涵盖内存模块,即在内层模块内可以引用定义在外层模块内的类型和量值。 当内层模块内定义了和外层模块内同名的类型和量值时,内层的类型和量值覆盖了外层模块的同名类型和量值,导致只能引用内层中定义的部分。,例6. 3 嵌套模块中的同名类型或量值的空间域 #include void main

8、() struct Person int id; char name10; ; struct Date int year; int month; int day; ;,main函数内(外层模块)定义的Person类型,main函数内(外层模块)定义的Date类型,Person ZS; /内嵌模块开始 struct Person int id; char name10; int Class; ; Person LiSi; Date Birthday; printf( sizeof(LiSi)= %dn, sizeof(LiSi); /内嵌模块结束 printf( sizeof(ZS)= %dn,

9、 sizeof(ZS); printf(%d, sizeof(LiSi); ,声明外层模块定义的Person类型的变量ZS,内、外层定义了同名的Person类型,LiSi是内层的Person类型的变量,内层模块定义的同名Person类型,成员不同,声明外层模块定义的Date类型的变量Birthday,外层定义,内层可见,在内层输出内层Person类型变量LiSi的大小,在外层输出外层Person类型变量ZS的大小,在外层输出内层Person类型变量LiSi的大小,编译出错,sizeof(LiSi)= 20 sizeof(ZS)= 16 Press any key to continue,6.2

10、.3文件域 程序的所有代码都是写在文件中的。 用C/C编写程序,最少要有一个文件。 在文件内定义的类型或量值(注意:不包含在任何模块中,而是直接定义在文件中)的空间域是从定义位置开始,到本文件的结束。本文件内,在定义该类型或量值后面的任何模块内或模块外,都可以引用该类型或量值。 类型只能定义在前,引用在后。 变量通常定义在前,引用在后。 变量如果定义在后,引用在先,必须在引用前明确用关键字extern声明。,例6. 4 文件中定义的类型或量值的空间域 #include struct Person int id; char name10; ; int i;,定义在文件中的Person类型,定义在

11、文件中的int型变量i,void main() Person ZS=1,张三; i=10; printf(i= %dn,i); printf(“id=%d name=%sn, ZS.id, ZS.name); ,在main函数的外层模块中声明一个Person类型的变量ZS,并赋值,在main函数的内层模块中引用整型变量i,并赋值,i= 10 id=1 name=张三 Press any key to continue,一个编译出错的示例程序: 程序中,将Person类型的定义写在文件的后端,而文件前端的main函数模块内,引用了后面才定义的Person类型。程序编译出错。,#include i

12、nt i; void main() Person ZS=1,张三; i=10; printf(i= %d,i); printf(%d %sn, ZS.id, ZS.name); struct Person int id; char name10; ;,在main函数的外层模块中声明一个定义在文件后面的Person类型的变量ZS,并赋值。编译出错,定义在文件后面的Person类型,用extern声明定义在后的变量的情况。 例6. 6 变量的先声明,再应用,而后定义 #include #include struct Person int id; char name10; ;,定义在文件前面的Per

13、son类型,void main() extern int i; i =10; extern Person ZS; ZS.id=1; strcpy(ZS.name, 张三); printf(i= %dn, i); printf(“id=%d name=%sn, ZS.id, ZS.name); Person ZS; int i;,定义在文件后面的变量i,ZS,声明在文件后面定义的变量i,声明在文件后面定义的变量ZS,i= 10 id=1 name=张三 Press any key to continue,#include #include struct Person int id; char n

14、ame10; ; void main() Person ZS=1, 张三 ; int i=10; printf(i= %dn, i); printf(%d %sn, ZS.id, ZS.name); extern int j; j=200; printf(“j=%dn, j); int j; ,出错,原因:”定义在后,重新声明,然后引用”的规则模块外(文件内)的全局变量在模块内引用的规则,不能应用于模块内声明的局部变量。 注意: ”定义在后,重新声明,然后引用”的规则不适合类型,只适合变量。,6.2.4工程域 工程中可以有多个文件 每个文件中可以有多个全局的类型、全局的量值和全局的函数模块 函

15、数模块内可以有多个局部的类型和局部的量值。 局部的类型和量值的空间域限制在它所在的模块,不会影响到同一个工程中的其它文件。 能够在一个工程中的多个文件之间相互影响的是一个文件内的全局类型、全局量值和全局函数模块。,例6. 7工程内全局类型和量值空间域(包含3个文件) (1)在VC中创建Win32 Console Application工程MyMFile(系统会自动添加文件扩展名.dsw) (2)创建C+ Source File文件MyMFile0(系统会自动添加文件扩展名.cpp),文件内容如下: int MyMax(int x, int y) return xy?x:y; ,求最大值函数,(

16、3)新建C/C+ Header File文件MyMFile(系统会自动添加文件扩展名.h),文件内容如下: #include #include struct Person int id; char name10; ; int MyMax(int, int); int i=100;,定义在本工程中各个文件内的函数(MyFile0.cpp)的声明,对系统头文件的包含,本工程要使用的类型定义,本工程中其它文件要使用的全局变量的定义。,(4)新建C+ Source File文件MyMFile1,文件内容如下: #include MyMFile.h void main() Person ZS; ZS.i

17、d=i; strcpy(ZS.name,张三); printf(i= %dn, i); printf(“id=%d name=%s, ZS.id, ZS.name); int max; max=MyMax(2,20); printf(max= %d, max); putchar(n); ,i= 100 id=100 name=张三 max= 20 Press any key to continue,写成:#include 出错,用户自定义的头文件只能使用双引号,可能会有这样的情况: 某些全局类型、全局量值和函数只使用在某几个特定文件中。这时,要单独新建特定的头文件,只在这几个文件中,包含该头文

18、件,在其它文件中不要包含该头文件。就是说,一个工程中,可以根据全局内容的使用范围,创建多个不同的头文件。 某些全局类型、全局量值和函数严格限定只能使用在某一个特定文件中。这时,将它们定义在这个文件中,并且在全局量值和函数的定义前使用关键字static。这时,同工程的其它文件无法使用。,如果MyMFile0.cpp文件的内容是如下形式: static int MyMax(int x, int y) return xy?x:y; 这时,程序就会出错。 原因是MyMax函数用static关键字,被限定在本文件MyMFile0.cpp中的其它函数调用,同工程的其它文件中的函数无法使用该函数,导致MyM

19、File1.cpp中的main函数调用出错。,6.3名词性的类型和量值在各逻辑结构上的时间域,通常:类型和量值的时间域和空间域是一致的。 特殊情况下:用关键字static对定义的变量和函数做限定时,空间域和时间域不同,时间域会大于空间域。,6.3.1模块内static 模块内用static定义的变量,其空间域仍然限定在该模块,但其时间域是整个工程,即在工程存活期内,该变量都占据内存,一直保持着原来的量值,但是在模块外由于超出空间域而无法访问,在模块内由于空间域和时间域重合,可以被访问。 这种变量叫“静态变量”。与其相对,缺省定义的变量,叫做“动态变量”,如通常的int a; 详细的可以写为au

20、to int a;。 动态量值在其被定义的模块外同时丧失空间域和时间域,即其占用的内存被释放,它的值当然就不存在了,也就无法访问了,例6. 8计算15的阶乘 #include int fac (int ); void main() int i; for (i=1; i=5; i+) printf(%d !=%dn, i, fac(i); ,循环调用阶乘函数,阶乘函数的声明,int fac(int n) static int f=1; f=f*n; return (f); ,定义f为静态变量,1 !=1 2 !=2 3 !=6 4 !=24 5 !=120 Press any key to co

21、ntinue,fac(1),static int f=1,return f,f=f*n=1,f=1,return f,f=f*n=2,fac(2),f=2,return f,f=f*n=6,fac(3),fac(4),f=6,return f,f=f*n=24,fac(5),f=24,return f,f=f*n=120,#include int fac (int ); void main() int i; for (i=1; i=5; i+) printf(%d !=%dn, i, fac(i); ,int fac(int n) int f=1; f=f*n; return (f); ,1

22、!=1 2 !=2 3 !=3 4 !=4 5 !=5 Press any key to continue,fac(1),int f=1,return f,f=f*n=1,int f=1,return f,f=f*n=2,fac(2),int f=1,return f,f=f*n=3,fac(3),fac(4),int f=1,return f,f=f*n=4,fac(5),int f=1,return f,f=f*n=5,6.3.2文件内的static 文件内只有三种成分: 1.类型的定义; 2.全局变量的定义; 3.函数的定义。 定义在文件内而模块外的类型其时间域和空间域永远相同,是整个工

23、程。 文件内定义的全局量值和函数,默认情况下时间域也是整个工程的运行时间。所以在本工程内的其它文件中,可以访问。 当在定义全局量值和函数时,用static加以限定,这时的全局量值和函数的时间域是整个工程,但空间域被限定在本文件。,例6. 9工程内全局类型和量值时间域 (1)在VC+环境中新建工程tem。 (2)新建C+ Source File文件tem1。输入如下代码: int a=1; (3)新建C+ Source File文件tem2。输入如下代码: #include void main() extern int a; printf(“a= %dn, a); ,对定义在本工程其它文件中全局

24、变量的声明,a= 1 Press any key to continue,例6. 9工程内全局类型和量值时间域 (1)在VC+环境中新建工程tem。 (2)新建C+ Source File文件tem1。输入如下代码: static b=2; (3)新建C+ Source File文件tem2。输入如下代码: #include void main() extern int b; printf(b= %dn, b); ,在文件tem1中变量b是用static定义的,它的空间域被限定在文件tem1中,编译出错:在文件tem2中无法对b声明和调用。,例6. 9工程内全局类型和量值时间域 (1)在VC+环境中新建工程tem。 (2)新建C+ Source File文件tem1。输入如下代码: int a=1; (3)新建C+ Source File文件tem2。输入如下代码: #include void main() int a; printf(“a= %dn, a); ,main()函数内的局部变量,未赋值;而并非tem1文件中声明的全局变量a,初值为1,a= -858993460 Press any key to continue,6.3.3关于static的总结 static用在模块中,作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论