计算机二级第十三讲
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十三讲第八章函数
第九章编译预处理
内容:
§8.9变量的存储类别
§8.10内部函数和外部函数
§9.1宏定义
§9.2文件包含
§8.9 动态存储变量和静态存储变量
一、内存中用户区存储空间的分配:
二、变量的存储类别
1. 按照变量的存在时间:
(1)动态存储:调用函数时分配存储单元,函数调用结束时释放所占存储单元。
即离开函数后变量的值不能被引用。下列变量属于动态存储:自动变量、形式参数、寄存器变量。
(2)静态存储:定义变量时分配存储单元,函数调用结束时并不释放所占存储
单元。离开函数后变量的值仍能被引用。下列变量属于静态存储:静态局部变
量、静态外部变量、外部变量。
(3)寄存器变量:如果某个变量在程序运行中使用频繁,为提高效率,C语言允
许将少数几个变量放在运算器中的寄存器中,叫做寄存器变量。
2. 按照变量值存放的位置:
(1)内存中静态存储区:存放外部变量、静态局部变量。
(2)内存中动态存储区:存放自动变量、形参变量。
(3)CPU中的寄存器:存放寄存器变量。
3. 存储类别小结:
(1)自动变量(auto): 定义在函数内部或者作为形参,存放在内存中的动态存
储区,生存期随函数调用的结束而结束,作用域在函数内部。
(2)静态局部变量(static):定义在函数内部,存放在内存中的静态存储区,生
存期等于整个程序的执行周期,作用域在函数内部。
(3)静态外部变量(static):定义在函数外部,存放在内存中的静态存储区,生
存期等于整个程序的执行周期。作用域为本源程序文件。
(4)外部变量:定义在函数外部,存放在内存中的静态存储区,生存期等于整个
程序的执行周期。作用域为本源程序文件和其它程序文件。
(5)寄存器变量:定义在函数内部或作为形参,存放在运算器中的寄存器中,
生存期随函数,作用域在函数内部或一个复合语句内部。
三、局部变量的存储方式
1. 函数中的局部变量的存储方式
函数中的局部变量的存储方式有3种:静态的、动态的和寄存器的:
(1)自动变量:当存储类别为auto或存储类别省略时,系统为这些变量在动态
存储区分配存储单元,叫做自动变量。
(2)静态局部变量:存储类别为static的局部变量,其存储区域为内存中的静
态存储区,这类变量叫做静态局部变量。
(3)寄存器变量:变量的数据存储在CPU中的寄存器中。
2. 函数中局部变量的说明:
(1)静态局部变量是在编译时赋初值的,而且只赋初值一次,以后每次调用函
数时不再重新赋初值,而只是保留上次函数调用结束时的值.自动变量不是在编译时赋初值的,而是在每一次调用函数时重新使给各个变量赋一次初值。
(2)如果局部变量在定义时不赋初值,则对于静态局部变量而言,在编译时自动赋初值0或空字符,而对于自动变量而言,其值则是随机的。
(3)尽管局部静态变量在函数调用结束后仍然存在,但其他函数不能引用它。
(4)只有局部自动变量和形式参数才能作为寄存器变量,全局变量和静态局部变量都不能作为寄存器变量。
(5)形式参数不能定义为静态局部变量。
例1 (教材P173例8.17) 局部静态变量的一个实例。
程序如下:
f(a)
int a;
{auto int b=0; /* 自动变量b,每次调用时都赋初值0 */
static int c=3; /* c为静态局部变量,只在编译时赋初值3 */
/* 第2次以后再调f函数时,c中保留上次调用后的值 */
/* 即第1次调用时c的值为3;第2次调用时c的值为4;第3次调用时c的值为5 */ b=b+1;
c=c+1;
return a+b+c;
}
main()
{int a=2,i;
for(i=0;i<3;i++)
printf("%d ",f(a)); /* 在循环中三次调用函数f,实参均为a */
}
程序运行结果为:
7 8 9
在函数中,如果有静态局部变量而且又2次以上调用该函数,一定要注意静态局部变量与自动变量在赋初值上的区别,以免出错。
想一想,如果将f函数中的变量b改为自动变量,程序运行的结果是什么?
下面一个程序也是静态局部变量的使用程序,请分析该程序输出的结果是什么?
fun()
{int a=2;
static int b=4;
a=a+2;
b+=2;
printf("a=%d b=%d\n",a,b);
}
main()
{fun();
fun();
fun();
}
四、全局变量的存储方式
1. 存储区域: 全局变量在编译时被分配在静态存储区。
2. 注意:
(1)静态外部变量:又叫作函数外部静态变量,定义在函数外部,只能被本文件
中的函数所引用,不能被其它文件中的函数引用,其定义格式为:
static 类型全局变量名;
(2)外部变量:定义在函数外部,既能被本文件中的函数引用又能被其它文件
中的函数引用,全局变量在定义时如果省略了存储类别说明,则为外部变量。
定义格式为:
类型外部变量名;
其它文件在引用外部变量时,要在文件开头对这些外部变量进行说明,说明格式为:
extern 类型外部变量名;
(3)如果外部变量定义在引用它的函数之后,则需要在引用前加以说明,说明格式为:
extern 类型外部变量名;
也就是说,extern 类型变量名; 这种用法,如果用在函数内部,是对一个在本源程序文件中在后面定义的一个外部变量进行说明(如§7.8例1);如果用在函数外部,是对一个在其它源程序文件中定义的一个外部变量进行说明(如§7.8例2)。
例2 (教材P例8.21) 在其它文件中使用外部变量。
程序的功能是: 给定b的值,输入a和m,求a*b和a^m的值,main函数在文件file1.c中,外部变量a在文件file1.c中定义;函数power的功能是求形参n的阶乘,在文件file2.c中定义,在file2.c中引用了在file1.c中定义的外部变量a。
程序如下:
file1.c中的内容:
#include "file2.c" /* 此处必须包含文件file2.c使之成为该源程序文件的一部分 */ int a; /* 定义可以由其它程序文件使用的外部变量a */
main()
{int power(); /* 对调用函数进行说明 */
int b=3,c,d,m;/* 给定b的值 */
printf("enter the number a and its power:\n");
scanf("%d,%d",&a,&m); /* 输入a,m的值 */
c=a*b; /* 求a*b的值 */