第8章第8节 §88局部变量和全局变量 局部变量 1概念—在一个函数内定义的变量为局部变量,只在本函数范围内有效 float fl(int a, int b) Rint c; a,b,c为局 c=a+b: 部变量 注意:们中的变量a,b,c 与主函数中的变量a,b,c 不是同一变量 main fint i,j, a, b, c; ,j,b为局 部变量 2.说明①主函数中定义的变量是局部变量,只在主函数中有效。 ②函数形参是局部变量,只在本函数范围内有效。 ③不同函数中的(局部变量可以同名,但互不干扰。 ④复合语句内可定义变量,只在该复合语句的范围内有效
§8.8 局部变量和全局变量 第8章第8节 一. 局部变量 1.概念——在一个函数内定义的变量为局部变量,只在本函数范围内有效 float f1(int a, int b) {int c; c=a+b; ...... } main() { int i, j, a, b,c; ...... } a, b, c为局 部变量 i, j,a,b为局 部变量 2. 说明 ① 主函数中定义的变量是局部变量,只在主函数中有效。 ② 函数形参是局部变量,只在本函数范围内有效。 ③ 不同函数中的(局部)变量可以同名,但互不干扰。 ④ 复合语句内可定义变量,只在该复合语句的范围内有效。 注意:f1中的变量a,b,c 与主函数中的变量a,b,c 不是同一变量
第8章第8节 main fint 1,a; a=4 printf( i=o oa\n Rint a, 同 变量 a=2 局部变量,只在 printf("a=%dn", a); 本范围内有效 pint"a=%小道为:2 值为:4 二全局变量 1概念—在函数之外定义的变量为全局变量(又名:外部变量),可被 本文件中其他函数共用。 2.有效范围(作用域)从定义变量的位置,到文件结束
main() {int i,a; i=1; a=4; printf("i=%d\n",i); {int a, a=2; printf("a=%d\n",a); } printf("a=%d\n",a); } 第8章第8节 同一 变量 局部变量,只在 本范围内有效 二. 全局变量 1.概念——在函数之外定义的变量为全局变量(又名:外部变量),可被 本文件中其他函数共用。 2. 有效范围(作用域)——从定义变量的位置,到文件结束。 值为:2 值为:4
第8章第8节 例: int p,q为全局变量 float fi(int a) 全局变量p,q的作用 Rint b, c; 范围。 一a,b,c为局部变量}n0,n0,和mim0函数 中都可以引用p,q charal. c2 c1,c2为全局变量 char f2(intx, int y) fint ], j →x,yii为局部变量|全局变量c2的作用 范围。 只有20和main0函数 可以引用c1,c2。 main( fint m, n; →m,n为局部变量
第8章第8节 例: int p=1, q=5; float f1(int a) {int b, c; ...... } char c1, c2; char f2(int x, int y) {int i, j; } main() {int m, n; ...... } p, q 为全局变量 a, b, c为局部变量 c1, c2 为全局变量 x, y, i, j为局部变量 m, n 为局部变量 全局变量 p, q 的作用 范围。 f1(), f2(), 和main() 函数 中都可以引用p, q。 全局变量 c1, c2 的作用 范围。 只有f2() 和main() 函数 可以引用c1,c2
第8章第8节 3.全局变量的使用 ①作为程序中各函数的公共变量(即同一文件中所有函数均可引用), 例 float pi=314; 全局变量 float fI(float r) Rreturn(pi*r*r); 以p=3.14代入计算 float f2(float) freturn(2.0*pi*r); float f3(float) 以p=3.1416代入计算 { return(4.0/3.0*pi*r*rr);} maint floatfi(float); float f2 (flat); float f3 (flat); float s..v r scant“ r”,&r); 此时pi=3.14 注:任何一个函数 s=fI(r) 中改变了全局变量 pi=3.1416; 的值,将影响到以后 l=f2(r);v=f3(r); 此时pi=3.1416 的计算 print(“s,yv=%,%f,%fn”,s,l,v);}
第8章第8节 3. 全局变量的使用 ① 作为程序中各函数的公共变量(即同一文件中所有函数均可引用), float pi=3.14; float f1(float r) {return(pi*r*r);} float f2(float r) {return(2.0*pi*r);} float f3(float r) {return(4.0/3.0*pi*r*r*r);} main() {float f1(float); float f2(flaot); float f3(flaot); float s, l, v, r scanf(“%f”,&r); s=f1(r); pi=3.1416; l=f2(r); v=f3(r); printf(“s,l,v=%f,%f,%f\n”,s,l,v); } 例 全局变量 此时pi=3.14 此时pi=3.1416 注: 任何一个函数 中改变了全局变量 的值, 将影响到以后 的计算 以pi=3.1416代入计算 以pi=3.14代入计算
第8章第8节 ②利用全局使函数返回多个值 例815:求一个数组各元素平均值,最大值,最小值。 float max. min 定义全局变量 main float average(flaot a[l, int n) fint i; Float average(flat a[, int n) float aver sum=0.0 float ave, score[10; max=a 0; min=a0; int for(i=0; K<=n-1; i++) for(i=0;<10;i++) sum=sumtail; scanf(“%r,& scored if(aimax)max=a; ave=average(score, 10; 求得平均值 else if(a[i]<min)min=a[]; printf("max, min, ave=%f, %f,%fn max, min, ave); aver=sum/n return(aver);+返回平均值
例8.15: 求一个数组各元素平均值, 最大值, 最小值。 float max, min float average(flaot a[], int n) {int i; float aver, sum=0.0; max=a[0]; min=a[0]; for(i=0;imax) max=a[i]; else if(a[i]<min) min=a[i]; } aver=sum/n; return(aver); } main() {float average(flaot a[], int n); float ave,score[10]; int i; for(i=0;i<10;i++) scanf(“%f”,&score[i]); ave=average(score,10); printf(“max,min,ave=%f,%f,%f\n”, max,min,ave); } 返回平均值 求得平均值 定义全局变量 ② 利用全局使函数返回多个值 第8章第8节
第8章第8节 ③局部变量与全局变量同名时的处理 局部变量优先—同一文件中,全局变量与局部变量同名,则在局部 变量的作用范围内,全局变量不起作用。 例816 int a=3, b=5 a,b为全局变量 max(int a, int b) Rint c, a,b,c为局部变量 c=a>b?a: b: return c, man fint a; a=8: b为全局变量(值为5) printf(“%d”,max(a,b); a为局部变量(值为8)
第8章第8节 ③ 局部变量与全局变量同名时的处理 ——同一文件中,全局变量与局部变量同名,则在局部 变量的作用范围内,全局变量不起作用。 例8.16 int a=3,b=5; max(int a, int b) {int c; c=a>b?a:b; return c; } main() {int a; a=8; printf(“%d”,max(a,b)); } a,b为全局变量 a,b,c为局部变量 b为全局变量(值为5) a为局部变量 (值为8) 局部变量优先
例8162 第8章第8节 int i=l 内为全局变量 main fint i,j; i=reset; for(j=1j<=2:j++) i为局部变量 { printf(“%d,%dn”,j); printi(%dn”,next(); print“%dm”,new();} 结果 int reset i为全局变量 freturn (i; 3 int next(int j) i为全局变量 freturn(j=i++);) 为局部变量 1,2 int new(int i) 2 fint j=10; return(i=j+=i) i为局部变量
例8.16-2 int i=1; main() {int i,j; i=reset(); for(j=1;j<=2;j++) {printf(“%d,%d\n”,i,j); printf(“%d\n”,next(i)); printf(“%d\n”,new(i));} } int reset() {return (i);} int next(int j) {return(j=i++); } int new(int i) {int j=10; return(i=j+=i); } i为全局变量 i,j 为局部变量 i为全局变量 j为局部变量 i,j 为局部变量 结果: 1,1 1 11 1,2 2 11 第8章第8节 i为全局变量
第8章第9节 §89变量的存储类别 变量的动态存储和静态存储方式 内存 程序(指今) 用户 区 使用 存放 全局变量 数静态存储区 静态存 分配的存储空间 据 储变量固定(地址固定)(局部静态变量 区动态存储区 动态存根据需要动态分「形参 设备管理 储变量配内存空间(地址 系统 不固定,函数调(局部变量等 使用 操作系统 用完后消失 数据类型int, float,char等 C中变量 的属性 存储类型「静态存储变量 动态存储变量 作用范围「全局变量 有一定联系 局部变量
第8章第9节 §8.9 变量的存储类别 一. 变量的动态存储和静态存储方式 内存 静态存储区 动态存储区 操作系统 设备管理 程序(指今) 区 系统 使用 用户 使用 数 据 区 静态存 储变量 分配的存储空间 固定(地址固定) 存 放 全局变量 局部静态变量 动态存 储变量 根据需要,动态分 配内存空间(地址 不固定),函数调 用完后消失。 形参 局部变量等 数据类型 存储类型 作用范围 int, float, char等 静态存储变量 动态存储变量 全局变量 局部变量 C中变量 的属性 有一定联系
第8章第9节 二局部变量的存储方式——动态存储 1.自动变量 系统根据当前的运行情况,自动为变量分配或释放存储空间。局 部变量,形参的均属于自动变量 类型声明 auto类型符变量表 auto可以省略 例 int f(int a) 等价 auto int b, c=3 int b.c=3 2.局部静态变量 类型声明stc类型符变量表 特点:函数调用后,不消失,并保留函数调用后的结果
第8章第9节 二. 局部变量的存储方式 动态存储 1. 自动变量 系统根据当前的运行情况, 自动为变量分配或释放存储空间。局 部变量,形参的均属于自动变量 类型声明 auto 类型符 变量表 例 int f(int a) {auto int b,c=3; ......} int b,c=3 等价 auto可以省略 2. 局部静态变量 类型声明 static 类型符 变量表 特点:函数调用后,不消失,并保留函数调用后的结果
第8章第9节 例817 分析 int f( int a) b 输出 Auto int b=0; 初值 2 static int c=3 b=b+1 第1次020+1→13+1-42+1+4→7 return (a+b+c) 第2次120+1→141→52+1+58 第3次 20+1→15+1-62+1+6→9 mainO fint a=2,i for(i=0;l<3;i+) printf((“%d”,f(a) 注:局部静态变量具有继承 性
第8章第9节 例8.17 int f( int a) {auto int b=0; static int c=3; 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)) } i a b c 输出 初值 第1次 第2次 第3次 2 0 3 0 2 0+1→1 3+1→4 2+1+4 →7 1 2 0+1→1 4+1→5 2+1+5 →8 1 2 0+1→1 5+1→6 2+1+6 →9 注:局部静态变量具有继承 性 分析