计算机二级第十三讲

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的值 */

相关文档
最新文档