第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
第19章 生存期、作用域与可见域
电脑版