文档介绍:上讲内容回顾
函数间的参数传递函数的嵌套调用和递归调用
第五章3
1
研究式学习—C程序设计(第五章)
第五章3
本讲内容
变量的作用域
变量的存储类型
编译预处理
2
研究式学习—C程序设计(第五章)
变量的作用域
main()
{float r,area;
printf(“r=?”);
scanf(“%f”,&r);
area=carea(r);
printf(“r=%,carae=%,cl=%\n”,r,area,cl);
}
程序运行结果:
r=?3
r= ,carae=,c1=
问题:写一个函数,送入圆
的半径后,得到圆的面积
及周长。
return语句只能返回一
个值,要返回多个值,要用
全局变量。
float cl;/*定义全局变量c1*/
float carea(float r)
{float ar;
ar=*r*r;
cl=2**r;
return ar; }
3
研究式学习—C程序设计(第五章)
float f1(int a) /*定义f1函数*/
{int b,c;
…}
char f2(int x) /*定义f2函数*/
{int b,j;
…}
main()/*主函数*/
{int m,n;
…}
p,q作用域
c1,c2作用域
局部变量(函数体内定义)作用域仅仅局限
于定义它的函数,在不同的函数内可以
定义同名的局部变量(f1、f2函数都有变量b)
全局变量(函数体外定义) :作用域从它定
义的位置开始到本源文件结束,变量名不能重。
(c1,c2的作用范围小)
int p=1,q=5;/*定义外部变量*/
char c1,c2;/*定义外部变量*/
4
研究式学习—C程序设计(第五章)
变量的存储类型(生存期)
问题:通过5次函数调用打印1到5的阶乘值。
1!=1,在1!的基础上再乘2,就得2!(2!=1!*2), 在2!的基础上再乘3,就得3!(3!=2!*3),…,
int fact(int x)
{ static int t=1;
t*=x;
return t;
}
main(){
int i;
for(i=1;i<=5;i++)
printf(“%d!=%d\n”i,fact(i));}
程序运行结果为:
1!=1
2!=2
3!=6
4!=24
5!=120
函数必须能保存
上一次的阶乘值!
5
研究式学习—C程序设计(第五章)
变量的完整定义
一个变量的完整定义形式为:
存储类型说明符数据类型说明符变量表
如:static int j; extern float x 等
定义变量时不但要说明变量的数据类型,还要说明变量的存储类型。变量的存储类型确定了变量的存储方式、生存期和作用域。
作用域:是指变量起作用的有效范围。按变量的作用域可以把变量分为全局变量和局部变量。
生存期:是指变量占用存储空间的时限。按变量的生存期可以把变量分为静态变量和动态变量。
6
研究式学习—C程序设计(第五章)
C语言的内存空间
程序代码区
静态存储区
动态存储区
*存放可执行程序的机器指令
*存放需要占用固定存储单元的变量
*存放不需要占用固定存储单元的变量
C语言程序所占用的存储空间通常分为三部分:
全局变量或静态变量存放在静态存储区中,直到整个程序运行结束时才释放存储单元;局部变量或自动变量存放在动态存储区中,函数调用结束时就释放存储单元。
7
研究式学习—C程序设计(第五章)
变量的存储类型
存储类型说明符有:
auto(自动)型:属于临时性存储,其存储空间可以被若干变量多次覆盖使用
register(寄存器)型(一般情况下不这样指定)
*存放在CPU的通用寄存器中,目的是提高执行速度
*long,double,float不能设为register型,因为超过寄存器长度
static(静态)型:存放在静态存储区域中,生命期长
extern(外部)型:用于定义或说明变量是外部的。
8
研究式学习—C程序设计(第五章)
局部变量的存储类型:auto static register
自动变量的使用:
#在函数内定义的变量,若没有指定存储类型就是自动类存储变量
#自动变量是在动态存储区内分配单元的。调用函数时分配这些单元,返回时释放这些单元
#自动变量在每调用一次时都赋一次值,且默认初值不确定
void test_auto()
{int va=0;
printf(“auto=%d,”,va);
++va; /*值不被保存*/
}
main()
{int i;
for(i=0;i<2;i++)
test_a