- // 局部变量和全局变量
- 定义变量可能有3种情况:
- 1.在函数的开头定义
- 2.在函数内的复合语句内定义
- 3.在函数的外部定义
- 在函数内定义的变量是局部变量,在函数之外定义的变量是全局变量
- 为了便于区别全局变量和局部变量,在C程序设计人员中有一个习惯(但非规定),
- 将全局变量名的第1个字母用大写表示。
- 有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,
- 能求出平均分、最高分和最低分。
- #include "stdafx.h"
- float Max=0,Min=0;
- int main()
- {
- float average(float array[ ],int n);
- float ave,score[10];
- int i;
- printf("Please enter 10 scores:");
- for(i=0;i<10;i++)
- scanf_s("%f",&score[i]);
- ave=average(score,10);
- printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
- return 0;
- }
- float average(float array[ ],int n)
- {
- int i;
- float aver,sum=array[0];
- Max=Min=array[0];
- for(i=1;i<n;i++)
- {
- if(array[i]>Max)
- Max=array[i];
- else
- if(array[i]<Min)
- Min=array[i];
- sum=sum+array[i];
- }
- aver=sum/n;
- return(aver);
- }
- // 动态存储方式与静态存储方式
- 变量的存储有两种不同的方式:
- 静态存储方式和动态存储方式
- 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。
- 动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。
- 动态存储区中存放以下数据:
- 1.函数形式参数:在调用函数时给形参分配存储空间
- 2.函数中定义的没有用关键字static声明的变量,即自动变量
- 3.函数调用时的现场保护和返回地址等。
- 在C语言中,每一个变量和函数都有两个属性: 数据类型 和 数据的存储类别 。
- C的存储类别包括4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)
- // 局部变量的存储类别
- 1.自动变量(auto 变量)
- int f(int a) //定义f函数,a为形参
- {
- auto int b,c=3; //定义b,c为自动变量
- ...
- }
- 其中,a是形参,b和c是自动变量,对c赋初值3
- 执行完f函数后,自动释放a,b,c所占的存储单元
- 实际上,关键字"auto"可以省略,不写 auto 则隐含指定为"自动存储类别",它属于动态存储方式
- 程序中大多数变量属于自动变量。
- int b,c=3;
- 与
- auto int b,c=3;
- 等价。
- 2.静态局部变量(static局部变量)
- 考察静态局部变量的值
- #include "stdafx.h"
- int main()
- {
- int f(int); //函数声明
- int a=2,i; //自动局部变量
- for(i=0;i<3;i++)
- printf("%d\n",f(a)); //输出f(a)的值
- return 0;
- }
- int f(int a)
- {
- auto int b=0; //自动局部变量
- static int c=3; //静态局部变量
- b=b+1;
- c=c+1;
- return(a+b+c);
- }
- 输出1到5的阶乘值
- #include "stdafx.h"
- int main()
- {
- int fac(int n);
- int i;
- for(i=1;i<=5;i++)
- printf("%d!=%d\n",i,fac(i));
- return 0;
- }
- int fac(int n)
- {
- static int f=1;
- f=f*n;
- return(f);
- }
- 3.寄存器变量(register 变量)
- 用关键字 register 作声明
- 如:
- register int f; //定义f为寄存器变量
- // 全局变量的存储类别
- 1.在一个文件内扩展外部变量的作用域
- 在定义点之前的函数需要应用该外部变量,则应该在应用之前用关键字 extern
- 对该变量作"外部变量声明",表示把该外部变量的作用域扩展到此位置。
- 调用函数,求3个整数中的大者
- #include "stdafx.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- int max();
- extern int A,B,C;
- printf("Please enter three integer numbers:");
- scanf_s("%d %d %d",&A,&B,&C);
- printf("max is %d\n",max());
- return 0;
- }
- int A,B,C;
- int max()
- {
- int m;
- m=A>B?A:B;
- if(C>m)
- m=C;
- return(m);
- }
- 2.将外部变量的作用域扩展到其他文件
- 在任一个文件中定义外部变量Num,而在另外一文件中用extern对Num作"外部变量声明",
- 即"extern Num"。
- 给定b的值,输入a和m,求a*b和a的m次方的值
- #include "stdafx.h"
- int A;
- int main()
- {
- int power(int);
- int b=3,c,d,m;
- printf("enter the number a and its power m:\n");
- scanf_s("%d,%d",&A,&m);
- c=A*b;
- printf("%d * %d=%d\n",A,b,c);
- d=power(m);
- printf("%d * * %d=%d\n",A,m,d);
- return 0;
- }
- extern int A;
- int power(int n)
- {
- int i,y=1;
- for(i=1;i<=n;i++)
- y*=A;
- return(y);
- }
- 3.将外部变量的作用域限制在本文件中
- 加上 static 声明、只能用于本文将的外部变量称为 "静态外部变量"
- 用 static 声明一个变量的作用:
- a.对局部变量用 static 声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在
- b.对全局变量用 static 声明,则该变量的作用域只限于本文件模块(即被声明的文件中)
- // 存储类别小结
- 对一个数据的定义,需要制定两种属性:数据类型和存储类别。
- static int a; //静态局部整型变量或静态外部整型变量
- auto char c; //自动变量,在函数内定义
- register int d; //寄存器变量,在函数内定义
- 可以用 extern 声明已定义的外部变量,例如:
- extern b; //将已定义的外部变量b的作用域扩展至此
- (1)从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:
- 局部变量 自动变量,即动态局部变量(离开函数,值就消失)
- 静态局部变量(离开函数,值仍保留)
- 寄存器变量(离开函数,值就消失)
- (形式参数可以定义为自动变量或寄存器变量)
- 全局变量 静态外部变量
- 外部变量(即非静态的外部变量,允许其他文件引用)
- (2)从变量存在的时间(生存期)来区分,有 动态存储和静态存储 两种类型
- 动态存储 自动变量(本函数内有效)
- 寄存器变量(本函数内有效)
- 形式参数(本函数内有效)
- 静态存储 静态局部变量(函数内有效)
- 静态外部变量(本文件内有效)
- 外部变量(用extern声明后,其他文件可应用)
- (3)从变量值存放的位置来区分
- 内存中静态存储区 静态局部变量
- 静态外部变量(函数外部静态变量)
- 外部变量(可谓其他文件引用)
- 内存中动态存储区 自动变量和形式参数
- CPU中的寄存器 寄存器变量
- (4)关于作用域和生存期的概念
- 如果某一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域。
- 如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期。
- (5)static 对局部变量和全局变量的作用不同
- 对局部变量来说,它使变量由动态存储方式改变为静态存储方式
- 而对全局变量来说,它使变量局部变化,但仍为静态存储方式。