第19讲 全局变量及其作用域和生存期 函数的存储分类_图文

第19讲
全局变量及其作用域和生存期 函数的存储分类

8.3 全局变量及其作用域和生存期 全局变量只有静态一种类别,放在静态存储区。
1. 全局变量的作用域和生存期 全局变量是可以在函数外部任意位置上定义的变量,它的 作用域是从定义点到整个源文件结束。 说明: (1)全局变量为函数之间的数据传递提供了一条通道。由于同 一文件的所有函数都能引用全局变量的值,如果在一个函 数中改变了某全局变量的值,就能影响使用该全局变量的 其它函数,相当于各个函数间有了直接传递的通道。 (2)全局变量的生存期是整个程序的运行期间,即“长期”。 (3)若全局变量与某一函数中的局部变量同名,则在该函数中, 全局变量被屏蔽,使用局部变量。

例8.4 编一函数求出10个整数的最大值、最小值和平均值。

main() {int x[10],j; int max,min; float average; float f(int a[10]) for(j=0;j<10;j++) { int i,sum=a[0]; scanf("%d",&x[j]); float aver; average=f(x); max=a[0]; printf("max=%d,min=%d,average= min=a[0]; %f\n",max,min,average); for(i=1;i<10;i++) } {sum=sum+a[i]; if(a[i]>max) max=a[i]; if(a[i]<min) min=a[i]); } aver=sum/10.0; return aver; }

例8.5 全局变量与局部变量同名问题。

int sum; void fun(void); main() { sum=10; printf("**main(1)**:%d\n",sum); fun(); printf("**main(2)**:%d\n",sum); } void fun(void) { 全局变量sum在fun int sum; 函数中不起作用。 sum=20; printf("** fun **:%d\n",sum); }

运行结果为: **main(1)**:10 ** fun **:20 **main(2)**:10 虽然全局变量的作用域大, 生存期长,用起来似乎方便 灵活,但除十分必要外,一 般不提倡使用全局变量。主 要有以下原因: 1.长期占用存储空间。 2.影响了函数的独立性, 不便于移植。 3.人在读程序时,难以确 定某一时刻的当前值。

2. 全局变量作用域的扩展
(1) 当全局变量定义在后,引用它的函数在前时,应该在引 用它的函数中用extern对此全局变量进行说明,使其作用域从 extern说明处起,延伸到该函数末尾。也可将extern写在函数 之外,使其作用域延伸至文件末尾。 (2) 当一个程序由多个文件组成时,每个文件都是一个独立 的编译单位。如果多个文件中都需要用同一个全局变量,这时 若在每个文件中都定义一个同名的全局变量,则单独编译各个 文件时不会产生错误,编译程序将按定义分别为它们分配存储 空间;但当连接时,将产生同一变量的重复定义的错误。 解决办法是:在其中一个文件中定义的全局变量,在其它 文件中用extern进行说明,说明这些全局变量已在某一编译单 位中定义过,通知编译程序不必再为它们开辟存储单元,只是 将作用域进一步扩展到本编译单位中。

例:在同文件中扩展全局变量的作用域

main( ) {void gx(),gy(); extern int x,y; …… 扩展后 gx(); 新增的 gy(); 作用域 …… } void gx( ) 书印错! {……} int x,y; void gy( ) x,y的原 { 作用域 …… }

extern int x,y; main() { …… } void gx() 扩展后 { x,y的 …… 作用域 } int x,y; void gy() x,y的 { 作用域 …… }

例:在不同文件中扩展全局变量的作用域

/*file1.c*/ int x,y; main( ) { …… f1(); f2(); f3(); …… } f1( ) { x=111; …… }

x,y的 作用域

扩 展 后 x 的 作 用 域

/*file2.c*/ extern int x; f2( ) { printf(“%d\n”,x); /*111*/ …… } f3( ) { x++; printf(“%d\n”,x); /*112*/ …… }

3.不允许扩展其作用域的全局变量(静态全局变量) 当定义全局变量时,若加上static,则称为静态全局变量, 其作用域仅限于本编译单位(本文件)。 /*file1.c*/ static int n; void f(); main() { …… f(); }

n的作 用域被 限定死

/*file2.c*/ extern int n; void f() { …… }

注意:static对局部变量和全局变量的作用效果不同。对局 部变量:作用域没变,存储类改为静态;对全局变量:存储 类没变,作用域仅限于本文件(小全局)。

8.4 函数的存储分类
1 外部函数 当定义一个函数时,若在函数返回值的类型前加上extern(或 缺省)时,称此函数为“外部”函数。它可以被同一个程序的其 它文件中的函数调用。 当函数调用语句与被调函数不在同一编译单位(源文件),且函 数的返回值为非整型时,应该在调用语句所在函数的说明部分用 extern对所调用的函数进行说明。 2 内部函数 当定义一个函数时,若在函数返回值的类型前加上static时, 称此函数为“静态”函数(或“内部”函数)。它只能被本 编译单位中的其它函数所调用。

使用静态函数,可避免不同的编译单位因为函 数同名而引起的混乱。

例:外部函数
/* file1.c */ main() {extern float f(float a,float b);
/* 说明f是其它文件(编译单位)已经定义的外部函数 */

float x,y,z; …… z=f(x,y); …… }
/* file2.c */ 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.9 以下程序的输出结果是 。 #include <stdio.h> main() { int k=4,m=1,p; p=func(k,m); printf("%d,",p); p=func(k,m); printf("%d\n",p); } func(int a,int b) { static int m=0,i=2; i+=m+1; m=i+a+b; return(m); } A) 8,17 B) 8,16 C) 8,20

D) 8,8

8.10 以下程序的输出结果是 #include<stdio.h> main() { int a[]={ 1,2,3,4 },i; int x=0; for(i=0; i<4; i++) { x=sub(a); printf("%d",x); } printf("\n"); } sub(int s[]) { static int t=3; int y; y=s[t]; t--; return y; } A) 1 2 3 4 B) 4 3 2 1



C) 0 0 0 0

D) 4 4 4 4

8.11 下面程序的输出结果是 。 #include <stdio.h> void fun( int s[]) { static int j=0; do s[j]+=s[j+1]; while(++j<2); } main() { int k, a[10]={1,2,3,4,5}; for(k=1; k<3; k++) fun(a); for(k=0; k<5; k++) printf("%d", a[k]); } A) 34756 B) 23445 C) 35745

D) 12345

8.12 下面程序的输出结果是 fun3(int x) { static int a=3; a+=x; return(a); } main() { int k=2, m=1, n; n=fun3(k); n=fun3(m); printf("%d\n",n); } A) 3 B) 4



C) 6

D) 9

8.13 以下程序的输出的结果是 。 int x=3; main() { int i; for (i=1;i<x;i++) incre(); } incre() { static int x=1; x*=x+1; printf(" %d",x); } A) 3 3 B) 2 2 C) 2 6 D) 2 5

8.14 下列程序执行后输出的结果是 #include <stdio.h> f(int a) { int b=0; static c=3; a=c++,b++; return (a); } main( ) { int a=2,i,k; for(i=0;i<2;i++) k=f(a++); printf("%d\n",k); } A) 3 B) 0 C) 5



D) 4

下面程序的输出结果是 。 #include <stdio.h> #define MAX_COUNT 4 void fun(); main() { int count; for (count=1; count<=MAX_COUNT; count++) fun(); } void fun() { static int i; i+=2; printf("%d",i); }

以下程序的输出结果是 。 main() { int a=3,b=2,c=1; c-=++b; b*=a+c; { int b=5,c=12; c/=b*2; a-=c; printf(“%d,%d,%d,”,a,b,c); a+=--c; } printf(“%d,%d,%d\n”,a,b,c); }


相关文档

第19讲 全局变量及其作用域和生存期 函数的存储分类1
第19讲 全局变量及其作用域和生存期 函数的存储分类讲解
第18讲 局部变量 全局变量和存储分类 局部变量作用域和生存期
第21讲 全局变量及其作用域和生存期 函数的存储分类lgf
第18讲 局部变量 全局变量和存储分类 局部变量作用域和生存期1
第3讲 变量作用域、存储类别,内部、外部函数
函数二 变量的生存期和作用域
C中变量的存储类型、生存期和作用域
第20讲 局部变量 全局变量和存储分类 局部变量作用域和生存期lgf
第8章 函数(变量作用域及生存期)
学霸百科
电脑版 | 学霸百科