预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

8.8局部变量和全局变量 8.8.1局部变量 局部变量:函数或分程序内定义的变量,只在本函数或本分程序内有效。 说明:(1)我们使用的变量一般是局部变量,main函数中的变量也是局部变量。 (2)不同函数可以使用相同的变量名,但他们是互不关联的两个变量 (3)形参是局部变量 (4)复合语句中的变量局部于本复合语句(分程序) 8.8.2全局变量 全局变量:在函数(所有函数)之外定义的变量,作用于其后的所有函数,叫做全局变量。 作用域(有效范围):定义变量的位置到本文件结束。 局部变量与全局变量尤如地方法规与全国法规。 说明 (1)优点:增加了函数的联系渠道,带回多于一个返回值。部分的节省了内存和执行时间。 (2)缺点:始终占用内存。降低了函数的独立性。降低了函数的可靠性和通用性。 模块化程序设计有一个原则:模块的“内聚性”强,与其他模块的“耦合性”小。 内聚性即模块内部的内在完整性,独立性,功能的单一性,封闭性。 耦合性:模块之间的互相影响,函数与数据的相关性。耦合性小,不确定因素就少。 习惯上我们把函数做成“黑箱”,只关心入口(形参和实参结合)和出口参数(函数值)及其函数功能,不关心模块(函数)内部的细节。这样,程序的可移植性好,可读性好。 全局变量的值不好控制,过多的使用全局变量会极大的降低程序的可读性 因此我们应尽量不使用全局变量 全局变量举例:使用软件的单位名,年,月,日 提倡:全局变量的第一个字母为大写。 (3)外部变量的屏蔽 li8_16.c程序分析的方法 8.9变量的存储类别 8.9.1动态存储方式与静态存储方式 作用域:空间 生存期:时间 存储区分类:程序区、静态存储区、动态存储区 全局变量全部存放在静态存储区,程序开始执行时分配存储区,程序运行期间占据固定的存储空间,程序执行完毕后释放掉。 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间,函数调用开始时动态分配存储区,函数结束时释放这些空间。形参、自动变量(无static声明的局部变量)存放在动态存储区、函数调用时的现场保护和返回地址等也存放在动态存储区(堆栈)。 同一函数两次调用时局部变量占据的存储空间地址可能不同。被调用函数局部变量的生存期并不等于整个程序的生存期。 变量和函数有两个属性:数据类型、数据的存储类别。 存储类别:数据在内存中存储的方法:静态存储类、动态存储类。根据存储类别决定变量的作用域和生存期。 8.9.2auto变量 auto变量:无static声明的局部变量。 用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。是动态存储方式。大多数变量是自动变量。 8.9.3用static声明局部变量 用static声明的局部变量是静态局部变量。 函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。 li8_17.c 说明: (1)静态局部变量属于静态存储类别,在静态存储区分配内存单元,在整个程序运行期间都不释放。 使用静态局部变量的值 (2)静态局部变量的初值:编译时赋初值,只赋初值一次,调用时已经有初值,调用时是不赋初值的。 (3)若定义时未赋初值,则初始化为0或'\0'(全0) (4)静态局部变量中“局部”的含义:只有本函数可以使用,其他函数无法使用该变量。 用途: (1)需要保留函数上一次调用的某些结果时,这些值可定义为静态变量。 li8_18.c阶乘 (2)某些变量初始化后只被引用而不改变其值时,可定义为静态变量。 (3)静态变量多占内存,降低可读性,没有必要时不要使用静态变量。 常见用法:统计某一个函数被调用的次数,或者与调用次数相关的其他统计工作。 函数调试的方法: 1监控函数的参数值 2加断点 8.9.4register变量 省去了内存与CPU的数据交换过程,直接使用CPU的内部寄存器。 li8_19.c 说明:(1)只有局部变量和形参可以作为register变量,全局变量不行。 (2)80x86系列CPU最多可使用的register变量数目有限。int型可使用8个通用寄存器。 实际上有些系统并不把register变量存放在寄存器中,而优化的编译系统则可以自动识别使用频繁的变量而把他们放在寄存器中,因此用register声明变量实际上是不必要的。我们只需要知道有这么一种变量即可。 (3)静态变量不能定义为register。 8.9.5用extern声明外部变量 外部变量即全局变量 可以用extern声明来改变全局变量的作用域 1.在一个文件内声明外部变量 一般将外部变量声明放在引用它的函数之前,也可以将外部变量定义放在引用它的函数之前。 li8_20.c 外部变量声明时可以不指定类型。 2.在多文件的程序中声明外部变量 在一