当前位置:
文档之家› 第19讲 全变量及其作用域和生存期 函数的存储分类ppt教学课件
第19讲 全变量及其作用域和生存期 函数的存储分类ppt教学课件
一文件的所有函数都能引用全局变量的值,如果在一个函 数中改变了某全局变量的值,就能影响使用该全局变量的 其它函数,相当于各个函数间有了直接传递的通道。 (2)全局变量的生存期是整个程序的运行期间,即“长期”。 (3)若全局变量与某一函数中的局部变量同名,则在该函数中, 全局变量被屏蔽,使用局部变量。
/* 说明f是其它文件(编译单位)已经定义的外部函数 */
float x,y,z; …… z=f(x,y); …… }
/* */ extern float f(float a,float b) { …… }
static float f(float a,float b)
第八章 作业
教材P128 习题八 第一大题:1、2、3、5、7、8小题; 第二大题:1、2、3、4小题;
8.4 函数的存储分类
1 外部函数 当定义一个函数时,若在函数返回值的类型前加上extern(或
缺省)时,称此函数为“外部”函数。它可以被同一个程序的其 它文件中的函数调用。
当函数调用语句与被调函数不在同一编译单位(源文件),且函 数的返回值为非整型时,应该在调用语句所在函数的说明部分用 extern对所调用的函数进行说明。
max=a[0];
average=f(x);
min=a[0];
printf("max=%d,min=%d,average=
for(i=1;i<10;i++) %f\n",max,min,average);
{sum=sum+a[i]; }
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i]);
(2) 当一个程序由多个文件组成时,每个文件都是一个独立 的编译单位。如果多个文件中都需要用同一个全局变量,这时 若在每个文件中都定义一个同名的全局变量,则单独编译各个 文件时不会产生错误,编译程序将按定义分别为它们分配存储 空间;但当连接时,将产生同一变量的重复定义的错误。
解决办法是:在其中一个文件中定义的全局变量,在其它 文件中用extern进行说明,说明这些全局变量已在某一编译单 位中定义过,通知编译程序不必再为它们开辟存储单元,只是 将作用域进一步扩展到本编译单位中。
printf("** fun **:%d\n",sum);
3.人在读程序时,难以确
}
定某一时刻的当前值。
2. 全局变量作用域的扩展
(1) 当全局变量定义在后,引用它的函数在前时,应该在引 用它的函数中用extern对此全局变量进行说明,使其作用域从 extern说明处起,延伸到该函数末尾。也可将extern写在函数 之外,使其作用域延伸至文件末尾。
}
aver=sum/10.0;
return aver;
}
例8.5 全局变量与局部变量同名问题。
int sum;
运行结果为:
void fun(void);
**main(1)**:10
main()
** fun **:20
{
**main(2)**:10
sum=10;
printf("**main(1)**:%d\n",sum); 虽然全局变量的作用域大,
例:在同文件中扩展全局变量的作用域
main( )
{void gx(),gy();
extern int x,y;
…… gx(); gy();
……
扩展后 新增的 作用域
}
void gx( ) {……}
书印错!
int x,y;
void gy( ) { ……
x,y的原 作用域
}
extern int x,y;
域
……
}
/**/ extern int x; f2( ) {
printf(“%d\n”,x); /*111*/ …… } f3( ) { x++; printf(“%d\n”,x); /*112*/
…… }
3.不允许扩展其作用域的全局变量(静态全局变量)
当定义全局变量时,若加上static,则称为静态全局变量, 其作用域仅限于本编译单位(本文件)。
例8.4 编一函数求出10个整数的最大值、最小值和平均值。
main()
int max,min;
{int x[10],j;
float f(int a[10])
float average;
{ int i,sum=a[0];
for(j=0;j<10;j++)
float aver;
scanf("%d",&x[j]);
main()
{
……
}
void gx() { …… }
扩展后 x,y的 作用域
int x,y;
void gy() { ……
x,y的 作用域
}
例:在不同文件中扩展全局变量的作用域
/**/
int x,y;
main( )
{
……
扩
f1();
展
f2();
后
f3();
x,y的
x
……
作用域
的
}
作
f1( )
用
{ x=111;
2 内部函数 当定义一个函数时,若在Байду номын сангаас数返回值的类型前加上static时,
称此函数为“静态”函数(或“内部”函数)。它只能被本 编译单位中的其它函数所调用。
使用静态函数,可避免不同的编译单位因为函 数同名而引起的混乱。
例:外部函数
/* */ main() {extern float f(float a,float b);
第19讲
函数的存储分类
2020/12/10
1
8.3 全局变量及其作用域和生存期
全局变量只有静态一种类别,放在静态存储区。
1. 全局变量的作用域和生存期 全局变量是可以在函数外部任意位置上定义的变量,它的 作用域是从定义点到整个源文件结束。
说明: (1)全局变量为函数之间的数据传递提供了一条通道。由于同
/**/ static int n; void f(); main() { …… f(); }
n的作 用域被 限定死
/**/ extern int n; void f() {
…… }
注意:static对局部变量和全局变量的作用效果不同。对局 部变量:作用域没变,存储类改为静态;对全局变量:存储 类没变,作用域仅限于本文件(小全局)。
fun();
生存期长,用起来似乎方便
printf("**main(2)**:%d\n",sum); 灵活,但除十分必要外,一
}
般不提倡使用全局变量。主
void fun(void)
要有以下原因:
{
全局变量sum在fun
int sum; 函数中不起作用。
sum=20;
1.长期占用存储空间。 2.影响了函数的独立性, 不便于移植。