for (i=0;i<3;i++) for(j=0;j<4;j++)
if (array[i][j]>max) max = array[i][j]; return (max); }
要与实参数组第二维大小相同 7.8局部变量和全局变量 7.8.1 局部变量 7.8.2 全局变量 7.8.1 局部变量
定义变量可能有三种情况: 在函数的开头定义
在函数内的复合语句内定义 在函数的外部定义 7.8.1 局部变量
在一个函数内部定义的变量只在本函数范围内有效 在复合语句内定义的变量只在本复合语句范围内有效 在函数内部或复合语句内部定义的变量称为“局部变量” float f1( int a) { int b,c; …… }
char f2(int x,int y) ? { int i,j; …… }
int main( ) ? { int m,n;
…… return 0; }
a、b、c仅在此函数内有效 x、y、i、j仅在此函数内有效 m、n仅在此函数内有效 float f1( int a) { int b,c; …… }
char f2(int x,int y) ? { int i,j; …… }
int main( ) ?
{ int a,b;
…… return 0; }
类似于不同班同名学生 a、b也仅在此函数内有效 int main ( ) { int a,b;
…… { int c; c=a+b; ……
} …… }
c仅在此复合语句内有效 a、b仅在此复合语句内有效 7.8.2全局变量
在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量 外部变量是全局变量(也称全程变量)
全局变量可以为本文件中其他函数所共用
有效范围为从定义变量的位置开始到本源文件结束 int p=1,q=5 float f1(int a)
{ int b,c; …… } char c1,c2;
char f2 (int x, int y) { int i,j; …… } int main ( ) { int m,n; …… return 0; }
p、q、c1、c2为全局变量 int p=1,q=5 float f1(int a)
{ int b,c; …… } char c1,c2;
char f2 (int x, int y) { int i,j; …… } int main ( ) { int m,n; …… return 0;
}
p、q的有效范围 c1、c2的有效范围
例7.14 有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。 解题思路:调用一个函数可以得到一个函数返回值,现在希望通过函数调用能得到3个结果。可以利用全局变量来达到此目的。 #include
float Max=0,Min=0; int main()
{ float average(float array[ ],int n); float ave,score[10]; int i;
printf(\ for(i=0;i<10;i++)
scanf(\ ave=average(score,10);
printf(\
average=%6.2f\\n\ return 0; }
float average(float array[ ],int n) { int i; float aver,sum=array[0]; Max=Min=array[0]; for(i=1;i { if(array[i]>Max) Max=array[i]; else if(array[i] aver=sum/n; return(aver); } ave score 10 Max Min aver array n Max Min main 函数 average 函数 建议不在必要时不要使用全局变量 例7.15 若外部变量与局部变量同名,分析结果。 #include { int max(int a,int b); int a=8; printf(“max=%d\\n”,max(a,b)); return 0; } int max(int a,int b) { int c; c=a>b?a:b; return(c); } a为局部变量,仅在此函数内有效 b为全部变量 #include { int max(int a,int b); int a=8; printf(“max=%d\\n”,max(a,b)); return 0; } int max(int a,int b) { int c; c=a>b?a:b; return(c); } a、b为局部变量,仅在此函数内有效 7.9变量的存储方式和生存期 7.9.1动态存储方式与静态存储方式 7.9.2 局部变量的存储类别 7.9.3 全局变量的存储类别 7.9.4 存储类别小结 7.9.1动态存储方式与静态存储方式 从变量的作用域的角度来观察,变量可以分为全局变量和局部变量 从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式和动态存储方式 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式 用户区 将数据存放在此区 全局变量全部存放在静态存储区中 ①函数形式参数②函数中定义的没有用关键字static声明的变量③函数调用时的现场保护和返回地址等存放在动态存储区 程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中占据固定的存储单元 函数调用开始时分配,函数结束时释放。在程序执行过程中,这种分配和释放是动态的 每一个变量和函数都有两个属性:数据类型和数据的存储类别 数据类型,如整型、浮点型等 存储类别指的是数据在内存中存储的方式(如静态存储和动态存储) 存储类别包括: 自动的、静态的、寄存器的、外部的 根据变量的存储类别,可以知道变量的作用域和生存期 7.9.2 局部变量的存储类别 1.自动变量(auto变量) 局部变量,如果不专门声明存储类别,都是动态地分配存储空间的 调用函数时,系统会给局部变量分配存储空间,调用结束时就自动释放空间。因此这类局部变量称为自动变量 自动变量用关键字auto作存储类别的声明 7.9.2 局部变量的存储类别 int f(int a) {? auto int b,c=3; ? ? ┇ } 可以省略 7.9.2 局部变量的存储类别 2.静态局部变量(static局部变量) 希望函数中的局部变量在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值),这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明 例7.16 考察静态局部变量的值。 #include { int f(int); int a=2,i; for(i=0;i<3;i++) printf(“%d\\n”,f(a)); return 0; } int f(int a) { auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c); } 调用三次 每调用一次,开辟新a和b,但c不是 例7.16 考察静态局部变量的值。 #include