第9章存储属性变量、函数的属性和编译预处理

上传人:小** 文档编号:57357399 上传时间:2018-10-21 格式:PPT 页数:61 大小:654.02KB
返回 下载 相关 举报
第9章存储属性变量、函数的属性和编译预处理_第1页
第1页 / 共61页
第9章存储属性变量、函数的属性和编译预处理_第2页
第2页 / 共61页
第9章存储属性变量、函数的属性和编译预处理_第3页
第3页 / 共61页
第9章存储属性变量、函数的属性和编译预处理_第4页
第4页 / 共61页
第9章存储属性变量、函数的属性和编译预处理_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《第9章存储属性变量、函数的属性和编译预处理》由会员分享,可在线阅读,更多相关《第9章存储属性变量、函数的属性和编译预处理(61页珍藏版)》请在金锄头文库上搜索。

1、第9章 变量、函数的属性和编译预处理,9.1 变量的存储类型 9.2 变量的作用域 9.3 内部函数和外部函数 9.4 编译预处理,本章重点:,1、变量的存储类型; 2、动态变量和静态变量; 3、局部变量和全局变量; 4、宏定义的使用; 5、文件包含的含义。,9.1 变量的存储类型,变量的属性: (1)操作属性:变量所持有的数据的性质数据类型。 (2)存储属性:变量所持有的存储的性质存储类型。,变量定义的一般形式: 存储类型标识符 数据类型标识符 变量表列;,9.1 变量的存储类型,9.1.1 变量的存储类型含义 变量的存储类型:指的是变量的存储方式。 包括: 1)系统何时为变量开辟和撤销存储

2、空间。反映的是变量存储空间存在的时间周期,即生存期。 2)系统在何地为变量开辟存储空间。反映的是变量值的存放位置。,9.1 变量的存储类型,9.1.2 变量的存储类型分类 1、从变量的生存期角度来划分,变量分为: 1)静态存储变量:在整个程序运行期间占有固定的存储空间的变量。变量的生存期为程序执行的整个过程。整个程序结束后变量的存储空间才被释放。 2)动态存储变量:在程序运行期间根据需要进行动态的分配存储空间的变量。变量的生存期为程序运行期间的某一段时间。也就是说,程序运行期间的某一段时间如果需要使用变量则系统为其开辟存储空间,不需要时其存储空间被释放。,RAM的用户区,1)程序区:用于存放用

3、户程序代码。 2)静态存储区:用于存放存储空间是固定的、使用该变量的程序运行结束后才释放存储空间的用户程序中的变量。 3)动态存储区:用于临时存放数据的内存单元,该内存区中的数据可以不断地被另外的变量值覆盖。,9.1 变量的存储类型,2、根据变量值存放位置的不同,变量又分为:1) 内存变量2) 寄存器变量变量值的存储部件:RAM和寄存器(CPU中)。 供用户使用的RAM存储空间分为三部分:程序区、静态存储区、动态存储区。,变量的存储类型有4种: auto(自动) static(静态) register(寄存器) extern(外部) 变量定义的一般形式: 存储类型标识符 数据类型标识符 变量表

4、列; 说明:存储类型标识符和数据类型标识符位置可以互换,没有先后顺序。,9.1 变量的存储类型,变量的存储类型规定了该变量的存储区域,同时也说明了该变量的生存期。,1自动变量(auto) 自动变量在程序运行期间由系统根据需要动态的在内存的动态存储区中为其开辟和释放存储单元,属于内存动态存储变量。 自动变量是在程序运行期间赋初值的,未赋初值时,其值是不确定的,即为随机值。,9.1 变量的存储类型,2静态变量(static) 在编译阶段被系统在内存的静态存储区分配了一定的内存单元,程序运行期间,它占据一个永久性的存储单元,直到整个程序运行结束才释放其存储单元。 静态变量是在程序的编译阶段赋初值的。

5、未赋初值的静态变量,C语言编译程序将其自动赋值为0(整型变量)、0.0(实型变量)或者空字符(字符型变量)。,9.1 变量的存储类型,3寄存器变量(register) 寄存器变量也属于动态存储变量,register型变量的值存储在CPU的通用寄存器中。为了提高运算速度,一般把使用较频繁的变量定义成register型变量。 寄存器变量是在运行时赋初值的,未赋初值时,其值是不确定的,即为随机值。,9.1 变量的存储类型,4外部类型(extern) 其属性与static变量的相同。 extern不能用于定义变量,但可以用来声明变量。,9.1 变量的存储类型,例如: auto float a; sta

6、tic char b; register int c;,9.1 变量的存储类型,9.2.1 局部变量及其作用域,变量的作用域:可以合法使用变量的区域。 从作用域的角度将变量分为局部变量和全局变量。,局部变量(内部变量):在函数内部或复合语句中定义的变量。 局部变量的存储类型有auto、static、register三种。 当局部变量的存储类型为auto型变量时,定义时auto可以省略。,9.2 变量的作用域,例如: void main( ) int x; /* x为局部变量,定义时省略auto */ 等价于: void main( ) auto int x; ,9.2 变量的作用域,在一个函数

7、内部定义的变量,其作用域为定义点到本函数体结束; 在一个复合语句中定义的变量,它的作用域为本复合语句内部。 函数的形参也是局部变量,其作用域为所在的函数。,9.2 变量的作用域,9.2 变量的作用域,说明: (1)在不同函数中可以使用相同名字的变量,由于它们所在的函数不同,其作用域是不同的,虽然名字相同但是它们代表的是不同的变量,彼此之间没有联系。,9.2 变量的作用域,【例9.1】 不同函数中的同名变量举例。 #include void main( ) int a,b;int sub( );a=3; b=4;printf(“main:a=%d,b=%dn“,a,b);sub( );print

8、f(“main:a=%d,b=%dn“,a,b); sub( ) int a,b;a=6; b=7;printf(“sub:a=%d,b=%dn“,a,b); ,程序运行结果: main:a=3,b=4 sub:a=6,b=7 main:a=3,b=4,(2)C语言规定,在同一个函数内部定义的同名局部变量,作用域小的变量屏蔽作用域大的同名变量。也就是说在作用域小的范围内使用同名变量时,作用域涵盖这个范围的同名变量不起作用。,9.2 变量的作用域,【例9.2】 同一函数中的同名变量举例。 #include void main( ) int a=1,b=2,c=3; +a; c+=+b; int

9、b=4,c; c=b*3; a+=c; printf(“1:%d,%d,%dt“,a,b,c); a+=c; printf(“2:%d,%d,%dt“,a,b,c); printf(“3:%d,%d,%dn“,a,b,c); ,程序运行结果: 1:14,4,12 2:26,4,12 3:26,3,6,复习与思考16,1、变量的存储类型有几种? 2、什么是变量的生存期?据此变量划分为几种? 3、什么是变量的作用域?据此变量划分为几种? 4、什么是局部变量?其可以使用的存储类型有什么?,【例9.3】 考查局部变量的值。 #include f(int a) auto int b=0;static i

10、nt c=3;/*静态局部变量*/b=b+1;c=c+1;return(a+b+c); void main( ) int a=2,i;for(i=0;i3;i+)printf(“%dn“, f(a); ,程序运行结果: 7 8 9,静态局部变量在其所在的函数调用结束后存储单元不释放,其值保留。,【例9.4】 输出1到5的阶乘值。 #include “stdio.h“ void main( ) int fac(int n);int i;for(i=1;i=5;i+)printf(“%d!=%dn“,i,fac(i); int fac(int n) register int i,f=1;for(i

11、=1;i=n;i+)f=f*i;return(f); ,程序运行结果: 1!=1 2!=2 3!=6 4!=24 5!=120,【例9.4改】 输出1到5的阶乘值(用静态局部变量)。 #include “stdio.h“ void main( ) int fac(int n);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); ,程序运行结果: 1!=1 2!=2 3!=6 4!=24 5!=120,9.2.2 全局变量及其作用域,全局变量(外部变量):函数

12、外部定义的变量。 它的作用域为从定义变量的位置开始到本源文件结束。,9.2 变量的作用域,说明: (1)全局变量的存储类型为内存静态存储变量。 全局变量在编译阶段系统为其在内存的静态存储区分配存储单元,在程序运行结束后存储单元才被释放。属静态变量。 全局变量在编译时赋初值,未赋初值的全局变量,系统将其自动赋值为0(整型变量)、0.0(实型变量)或者空字符(字符型变量)。,9.2 变量的作用域,(2)通过对全局变量的声明可以扩大其作用域。全局变量声明(说明)的一般形式为:extern 数据类型标识符 变量表列; 例如:,9.2 变量的作用域,注意: 全局变量的声明和全局变量的定义二者有本质区别:

13、全局变量定义时,系统会为其分配存储单元,对同一个变量的定义只能出现一次;而全局变量的声明,系统不会为其分配存储单元,只是告诉系统声明的变量是在函数外部已经定义过的全局变量。全局变量的声明在程序中可以出现多次;全局变量的声明可以放在函数外部也可以放在要使用全局变量的函数内部。,9.2 变量的作用域,【例9.5】 用extern声明本文件定义的外部变量来扩大外部变量的作用域。 #include “stdio.h“ void main( ) void swap( ); /* 函数声明 */extern int x,y; /* 全局变量声明 */printf(“请输入x=?,y=?n“);scanf(

14、“x=%d,y=%d“, ,程序运行情况: 请输入x=?,y=? x=6,y=8 x=8,y=6,【例9.6】 用extern声明其他文件的外部变量来扩大外部变量的作用域。 /* C 源程序文件D:f1.c的内容 */ #include “stdio.h“ #include “D:f2.c“ int x; /* 外部变量定义 */ void main( ) int sum,y;printf(“y=?n“); scanf(“y=%d“, ,执行源程序文件D:f1.c,程序运行情况如下: y=? y=20 sum=30,(3)用static声明外部变量,在程序设计中,某些外部变量只限于被本文件引用

15、,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。,9.2 变量的作用域,【例9.6】 用extern声明其他文件的外部变量来扩大外部变量的作用域。 /* C 源程序文件D:f1.c的内容 */ #include “stdio.h“ #include “D:f2.c“ static int x; /* 外部变量定义 */ void main( ) int sum,y;printf(“y=?n“, ,执行源程序文件D:f1.c,程序运行情况如下: y=? y=20 sum=30,(4)若在同一源文件中,局部变量与全局变量同名,则在局部变量的作用范围内,局部变量起作用,全局变

16、量被屏蔽,不起作用。,9.2 变量的作用域,【例9.7】 外部变量与局部变量同名。 程序如下: #include “stdio.h“ int a=4,b=5; int min(int a,int b) int c;c=ab?a:b; return(c); void main() int a=8; printf(“%dn“,min(a,b); ,运行结果为 5,9.2 变量的作用域,请看习题二-2,【例9.8】 学生信息包括学号、姓名、四门课成绩,求出学生所学四门课的平均分、最高分和最低分。#include “stdio.h“ struct student /* 外部结构体类型定义*/ int num;char name10;float score4; ; struct student st=101,“Zhang“,89.5,98,78.5,66.5; float max,min;,

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

当前位置:首页 > 商业/管理/HR > 经营企划

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