内蒙古机电职业技术学院
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内蒙古机电职业技术学院
教案首页c语言程序设计计信、自动化
4.4变量的作用域及存储特性
先看一个例子,错在那里?:
void f1( )
{ int t=2;
a *= t;
b /= t;
}
main()
{ int a, b;
printf(“ Enter a,b:”);
scanf(“%d,%d”, &a, &b);
f1( ); /* 调用函数f1( ) */
printf (“a=%d,b=%d”, a, b);
}
编译程序会提示出错: Undefined symbol ‘a’和Undefined symbol ‘b’。
为什么?
4.4.1 变量的作用域
1.变量按作用域分为全局变量和局部变量
2.区别:
全局变量(外部变量) 局部变量(内部变量)
定义位置: 函数体外函数体内
作用域: 从定义处到本源文件结束从定义处到本函数结束
举例: 所有函数体外定义的变量(1)所有在函数体内定义的变量(2)形式参数
注意与局部变量同名的处理:局部变量屏蔽全局变量;不同函数中同名局部变量互不干扰.
分析下面程序的执行结果:
#include
int a,b; /*a,b为全局变量*/
void f1(int x )
{ int t1,t2,a;
a=t1 = x* 4;
t2 = b * 3;
b = 10;printf (“f1:t1=%d,t2=%d,a=%d,b=%d\n”, t1,t2,a,b);
}
main( )
{ a=2; b=4; /* 此a,b是全局变量,赋值*/
f1( a); /* 调用函数f1( ) */
printf (“main: a=%d,b=%d”, a, b);
}
程序输出结果为: f1:t1=4,t2=12,a=8,b=10
main:a=2,b=10
若将程序改为:
#include
int a=2,b=4; /*a,b为全局变量*/
void f1( )
{ int t1,t2;
t1 = a * 2;
t2 = b * 3;
b = 100;
printf (“t1=%d,t2=%d\n”, t1, t2);
}
main()
{ int b=4; /* 此a,b是全局变量,赋值*/
f1( ); /* 调用函数f1( ) */
printf (“a=%d,b=%d”, a, b);
}
程序输出结果为:
t1=4,t2=12
a=2,b=4
4.4.2 变量的存储特性
1.变量按存在时间分:静态变量,动态变量
静态存储类型的变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,通常称它们为永久存储。
动态存储类型变量只生存在某一段时间内。
例如,函数的形参和函数
体或分程序中定义的变量,只是在程序进入该函数或分程序时才分配存储空间,当该函数或分程序执行完后,变量对应的存储空间又被撤销了。
2.c语言中每一个变量有两个属性:数据类型,存储特性
完整的变量定义: [存储特性] [数据类型] 变量名;
3.变量的存储特性
自动型auto
静态型static
寄存器型register
外部型extern
(1) auto型
例如:形式参数,自动型局部变量
每次进入程序是自动分配内存,不长期占用内存
(2)static 型
①局部静态变量②全局静态变量
长期占用内存
试分析下面程序的执行结果:
f(int a)
{int b=0; static int c=3; /*静态变量只初始化一次*/
b++;c++;
printf(“%5d%5d%5d”,a,b,c);
return(a+b+c);
}
main()
{int a=2,k;
for(k=0;k<3;k++)
printf(“%5d\n”,f(a));
}
(3) register型
将使用频率高的变量定义为register型,可以提高运行速度.
寄存器变量只限于整型、字符型、指针型的局部变量。
寄存器变量是动态变量,而且数目有限, 一般仅允许说明两个寄存器变量。
例如:
register int d;
register char c;
(4)extern型
引用: extern 类型变量名;
如果某个模块文件中要用到另一个模块文件中的全局变量,就要用extern说明一个外部变量
例如:程序模块file1.c中定义了全局变量int s ;
而在另一个程序模块file2.c中的函数fun1( )中需要使用这个变量s,为此,可以在file2.c的函数fun1( )中加上外部变量说明语句:
fun1( )
{ extern int s;/*表明变量s是在其他文件定义的*/
.......
}
定义时分配内存,其他文件引用时不再分配内存.。