C及C++程序设计 第3版 教学课件 ppt 张富 第10章-数据的存储类型

上传人:E**** 文档编号:89343580 上传时间:2019-05-23 格式:PPT 页数:82 大小:325KB
返回 下载 相关 举报
C及C++程序设计 第3版  教学课件 ppt 张富 第10章-数据的存储类型_第1页
第1页 / 共82页
C及C++程序设计 第3版  教学课件 ppt 张富 第10章-数据的存储类型_第2页
第2页 / 共82页
C及C++程序设计 第3版  教学课件 ppt 张富 第10章-数据的存储类型_第3页
第3页 / 共82页
C及C++程序设计 第3版  教学课件 ppt 张富 第10章-数据的存储类型_第4页
第4页 / 共82页
C及C++程序设计 第3版  教学课件 ppt 张富 第10章-数据的存储类型_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《C及C++程序设计 第3版 教学课件 ppt 张富 第10章-数据的存储类型》由会员分享,可在线阅读,更多相关《C及C++程序设计 第3版 教学课件 ppt 张富 第10章-数据的存储类型(82页珍藏版)》请在金锄头文库上搜索。

1、,第10章 数据的存储类型,本章介绍C语言对变量规定的一些存储类型。其中要涉及变量的生存期,变量的作用域,可见性,局部变量和全局变量等一些重要概念。,10.1 变量在内存中的存储,系统为运行程序,在内存中为数据的存储开辟了两块区域:静态数据区和动态数据区。分配在静态数据区的变量,叫做静态变量,分配在动态数据区的变量叫做动态变量。,变量从在数据区建立到被撤销,这段时间称为变量的生存期。C程序在编译时,有些变量分配到静态数据区。分配在静态数据区的变量,在程序运行结束前是一直存在的。这样的变量的生存期为程序的运行期。,有些变量是在程序运行期间根据需要动态地分配到动态数据区的,在适当的时候会将这种动态

2、变量的空间收回。所以,动态变量的生存期是有限的。,变量在程序的某一部分是有效的,而在另一部分可能是无效的,不可见的。有的变量可能在整个程序文件中一直有效的。对于上述情况,我们说变量有不同的作用域。所谓变量的作用域,就是指变量的使用范围。,从作用域这个角度讲,变量区分为局部变量和全局变量。全局变量分配在静态数据区,而局部变量则根据需要可能分配在动态数据区,也可能分配在静态数据区。,10.2 局部变量和全局变量,根据作用域的不同,变量分为两种类型:局部变量,全局变量。,10.2.1 局部变量 在任何一个代码块内定义的变量叫做局部变量。所谓代码块就是在一对花括号内的代码段,包括函数体,函数体内的语句

3、块。局部变量只能在说明它的代码块内使用,局部变量的作用域,限于说明它的代码块内:从说明的地方开始至所在的代码块结束。,局部变量在没有初始化或没有被赋值之前,它的值是不确定的。 形参也是局部变量。它的作用域和使用规则与函数内部的局部变量完全一样。,10.2.2 全局变量 作用域是从定义点开始直到程序文件结束的变量,称为全局变量。全局变量在程序的整个运行过程中,都占用存储单元,而不像局部变量那样,只有在它的作用域范围内才存在。,整个程序文件设置全局变量的好处就在于,增加了函数间传递数据的渠道。,【例10-2】 求下面一元二次方程的根: 要求在这个程序中,方程的系数a,b,c设置为局部变量,方程的根

4、X1,X2和根的虚部q和实部p都设置为全局变量,b24ac的值d也设置位全局变量。三种根(两个不同的实根,两个相等的实根和两个虚根)分别由三个函数计算。,图10-1 计算一元二次方程根的流程图,使用全局变量也有负面的影响。 全局变量使得函数的执行依赖于外部变量。降低了程序的通用性。程序设计的模块化要求各模块之间的“关联性”要小。全局变量不符合这个要求。模块化设计希望函数是封闭的,通过参数与外界发生联系。,10.3 变量的存储类型,在静态和动态两大类存储方法中,C语言将变量的存储类型分为四种,它们的存储类型说明符和名称如下。,auto 自动变量 static 静态局部变量 extern 外部变量

5、 register 寄存器变量,在变量定义语句中,存储类型符放在它所修饰的数据类型前面,其一般形式如下: 存储类型符 数据类型符 变量名表;,10.3.1 局部变量的存储定义 1自动变量(auto) 在函数内定义的或在函数的语句块内定义的变量,若存储类型省略或写为auto,都是自动变量。此前的程序中使用的都属于自动变量。,因此,下面的两条变量定义语句是等价的: int a,b; auto int a,b;,自动变量属于动态存储类。系统在函数运行时自动为其动态分配空间。离开它的作用域时系统释放(收回)它的存储空间。,因此,自动变量的生存期就是程序进入其作用域期间。例如,局部于某函数的自动变量,在

6、调用该函数时,变量在动态存储区被分配存储空间。函数调用结束后,变量的存储空间被释放。变量的值当然也不存在了。这就是变量的生存期。,自动变量在初始化前,或没有赋值前,它的值是不确定。,2静态局部变量(static) 有时希望局部变量的值,在每次离开其作用范围后不消失并且保持原值,占用的存储空间不释放。这时,应该用存储定义符static将变量定义为静态局部变量。,例如,在函数内的语句: static int num1, num2; 定义变量num1和num2为静态局部变量。,静态局部变量属于静态存储类型,在静态存储区为其分配存储空间。在整个程序运行期间都不释放,变量的生存期是程序运行期。,虽然静态

7、局部变量的存储空间在整个程序运行中都保持着,但是,在它的作用域以外,仍然是不能被引用的。函数的静态局部变量值可以在函数的两次调用之间保持值不变。,表10-1给出前四次调用函数numbers(void)的运算情况。通过表10-1可以看到程序的运行结果是怎样得到的。,3寄存器变量(register) 如果变量在程序运行中使用非常频繁,则为存取该变量要消耗很多时间。利用寄存器操作速度快的特点,将变量存放在CPU的寄存器中,可以提高程序的运行效率。寄存器变量占用CPU的高速寄存器,不占用内存单元。变量的值就保存在CPU的寄存器中。,10.3.2 全局变量的存储定义 1外部全局变量 全局变量是在函数外部

8、定义的变量。变量在编译时分配在静态数据区,生存期是程序运行期。,作用域是从定义点往后的所有定义的函数均有效。但当与函数内的局部变量同名时,局部变量是有效的,全局变量无效。,对于一个很大的程序,为了编写、调试、编译和修改程序的方便,常把一个程序设计成多个文件的模块结构。每个模块或文件完成一个或几个较小的功能。,这样,就可以先对每个模块或文件单独进行编译,然后再将各模块链接在一起。那么,在多个源程序文件的情况下,全局变量是否也可以被其他模块的各函数调用呢?,如果在一个源文件中将某些变量定义为全局变量。而这些全局变量允许其他源文件中的函数引用的话,就需要有一种办法,把程序的全局变量告诉相关的模块文件

9、。,解决的办法是,在一个模块文件中将变量定义为全局变量,而在引用这个变量的模块文件中,用存储类型符extern将其说明为外部变量。,例如,语句: extern int a; 说明整型变量a在其他源程序文件中已经定义为全局变量,在本文件中被说明是外部存储类型的,因而本文件可以引用。,注意,供各模块文件都可以访问的全局变量,在程序中只能被定义一次。但在不同的地方可以被多次说明为外部。在说明为外部变量时,不再为它分配内存。extern定义符的作用只是将一个文件定义全局变量的作用域延伸到本源程序文件。,2静态全局变量 静态全局变量是这样一种全局变量,它在被定义的源程序文件以外是不可见的。也就是说,静态

10、全局变量只限于它所在的源程序文件中的函数引用,而不能被其他源程序文件中的函数引用。,静态全局变量定义的形式是在全局变量定义语句的数据类型前加静态存储定义符static。其定义形式和局部静态变量是一样的。其一般形式为: static 数据类型 变量;,例如定义整型变量a为静态全局变量: static int a; 静态全局变量分配在静态数据区,生存期是程序运行期,在这一点上,与静态局部变量是一样的。,静态全局变量与静态局部变量在作用域方面是不相同的。 静态全局变量与全局变量在同一文件内的作用域是一样的,但全局变量的作用域可延伸到其他程序文件。,静态局部变量与(动态)局部变量在作用域上相同的,但前

11、者分配在静态数据区,后者分配在动态数据区。因而它们的生存期是不同的。,10.3.3 变量存储类型小结 一个数据包含有两方面的属性:数据类型和存储类型。这一节重点介绍数据的存储类型。,从作用域的角度,有局部变量和全局变量。按它们的存储类别,局部变量又分为自动的、静态的和寄存器的三种。全局变量又分为静态的和外部的两种。,从生存期(存在性)的角度,有动态存储和静态存储两类。动态存储类的数据分配在动态数据区,是在进入相应的定义块时分配存储单元,如自动变量,寄存器变量和形参属于此类。,静态存储类的数据分配在静态数据区,是编译时分配的,在整个程序运行期间都存在,如静态局部变量、静态外部变量和全局变量属于此

12、类。,现将上述变量的存储类型从作用域和生存期的角度归纳成表10-2。表中“”表示“是”,“”表示“否”。,10.4 内部函数和外部函数,10.4.1 内部函数与外部函数 对于一个多源程序文件的C程序来说,根据一个函数能否调用其他源程序文件的函数,将函数分为内部函数和外部函数。,如果一个函数只能被本源程序文件的函数所调用,这样的函数称为内部函数。内部函数也叫做静态函数。内部函数在定义时,要在函数类型前加上说明符static。,使用内部函数的好处是,如果在一个较大的程序的不同文件中,函数同名不会产生相互干扰。这样,就有利于不同的人分工编写不同的函数,而不必担心函数是否同名。,外部函数可以被程序的其

13、他文件内的函数调用。外部函数定义的方法是,在定义函数时,在函数类型前加extern。,如果在定义函数时省略extern,则隐含为外部函数。,在定义时虽然没有用extern说明,但实际上就是外部函数,它们可以被另一个文件的函数调用。 在需要调用外部函数的文件中,用extern说明所用的函数是外部函数。,10.4.2 在Turbo C+集成环境下编译多文件程序 在Turbo C+的集成开发环境中,多文件程序称为工程或项目(projects)。每个工程有一个相应的工程文件或项目文件(project file)。,工程文件是用来说明该工程包括哪些文件。所有的工程文件的扩展名都是.PRJ。,在集成环开发

14、境下编译多文件程序的步骤如下: (1)分别完成各源程序文件的编译; (2)选择主菜单中的projet;,(3)选择其中的Open projiect.子命令以建立工程文件; (4)用Add item命令将组成该PRJ工程文件的各文件装入,完成Projiect文件建立;,(5)选compile主菜单下面的Make EXE File子命令或选Link EXE File子命令,产生可执行文件; (6)最后,运行可执行文件。,也可以将第(5)、(6)步操作合并为一步,直接选主菜单的Run下的子命令Run,连接和运行连续完成。,10.5 动态存储单元,C语言在计算机中存储数据的方式有两种,第一种方式,是通

15、过定义变量来存储;第二种方式,是通过C语言的动态存储分配系统来分配内存。,在第一种方式下,程序设计人员需要定义全局变量或局部变量。在第二种方式下,在程序运行中,当需要存储空间时,向系统申请,使用完毕,还将申请的内存空间退还给系统。,内存空间的申请和退还,是通过C的存储分配系统的函数malloc()和free()实现的。使用这些函数时应包含头文件stdlib.h。,内存分配函数malloc()的格式为: void *malloc(int size),该函数的功能是申请大小由参数size指定的内存空间。函数返回一个void类型的指针。这个指针指向分配到的存储区的首地址。如果调用失败,则返回一个空值

16、0(系统定义的符号是NULL)。Void类型指针可用做各种数据类型的指针。,函数的参数“size”是申请内存的字节数,这个数值可以事先计算好,也可以用运算符sizeof()来确定。,例如,sizeof(float)可以计算出一个浮点数所需要的字节数,并可作为内存分配函数的参数。,例如,申请可以存储三个浮点数的内存空间的语句: malloc(3*sizeof(float),如果动态分配内存失败,会使程序运行不能正常进行,因此,程序中应安排一个程序段, 判断申请内存是否成功。,内存释放函数free()的格式为: void free(void *ptr),free()函数的功能与malloc相反,它是把已分配的内存空间交还给系统。被交还的内存空间,可以重新分配使用。参数p是所要释放的内存首地址,即当初内存分配函数返回的指针。,10.6 修饰符const,影响变量存取特性的修饰符const,称为常量修饰符。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号