9.7 变量的存储属性

9.7 变量的存储属性

   在C语言中,变量是对程序中数据所占用内存空间的一种抽象,定义变量时,用户定义变量的名,变量的类型,这是变量的操作属性。不仅可以通过变量名访问该变量,系统还通过该标识符确定该变量在内存空间的位置。在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是CPU中的寄存器,变量的存储属性就是讨论变量的存储位置的,C语言中定义了四种存储属性,即自动变量、外部变量、静态变量和寄存器变量,它关系到变量在内存中的存放位置,由此决定了变量的值保留的时间和变量的作用范围,这就是生存期和作用域的概念。

9.7.1 变量的生存期和作用域
1、变量的生存期

变量的生存期是指变量值保留的期限,可分为两种情况:
(1)静态存储:变量存储在内存中的静态存储区,在编译时就分配了存储空间,在整个程序运行期间,该变量占有固定的存储单元,变量的值都始终存在,程序结束后,这部分空间才释放。这类变量的生存期为整个程序。
(2)动态存储:变量存储在内存中的动态存储区,在程序运行过程中,只有当变量所在函数被调用时,编译系统临时为该变量分配一段内存单元,该变量有值,函数调用结束,变量值消失,这部分空间释放。我们说这类变量的生存期仅在函数调用期间。

2、变量的作用域

变量的作用域也称为可见性,指变量的有效范围,可分为局部与全局两种情况:
(1)局部变量:在一个函数或复合语句内定义的变量,称为局部变量,局部变量仅在定义它的函数或复合语句内有效。例如函数的形参是局部变量。
编译时,编译系统不为局部变量分配内存单元,而是在程序的运行中,当局部变量所在的函数被调用时,编译系统根据需要临时分配内存,调用结束,空间释放。

例9-17:分析程序的运行结果。
func11( )
{ int x=3;
{ int x=2; /* 第一个复合语句中的局部变量 */
{ int x=1; /* 第二个复合语句中的局部变量 */
printf("*x=%d/n", x);
}
printf("**x=%d/n", x);
}
printf("***x=%d/n", x);
}
main( )
{ int x=10;
printf("1: x=%d/n", x);
func11( );
printf("2:x=%d/n", x);
}

程序的运行结果是:
1: x=10 /* 输出主函数内的变量 x */
*x=1 /* 输出第一个复合语句中的变量x */
**x=2 /* 输出第二个复合语句中的变量x */
***x=3 /* 输出函数func11中的变量x */
2: x=10 /* 输出主函数内的变量x */
(2)全局变量:变量在所有函数之外定义称为全局变量,其作用范围为从定义开始,到本文件结束。全程变量一经定义,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元。如果在定义之前使用该全局变量,用extern加以说明,则可扩展全局变量的作用域。
(3)使用全局变量与局部变量,应注意以下几点:
①不同函数内的局部变量可以重名,互不影响。
②全局变量与局部变量可以同名,在局部变量起作用的范围内,全局变量不起作用。
③全局变量的初始化只能有一次,是在对全局变量说明的时候。

例9-18:分析以下程序的运行结果。
int x=100; /* 全局变量的定义 */
func12( )
{ int x=10; /* 局部变量,函数内有效 */
f( );
ff( );
printf("%d/n", x);
}
f( )
{ int x=500; /* 局部变量,函数内有效 */
x += 100;
printf("%d/n", x);
}
ff( )
{ x += 100; /* 使用全局变量 */
printf ("%d/n", x);
}
程序运行结果: 600 /* 调用函数f( )的结果 */
200 /* 调用函数ff( )的结果 */
10 /* 函数func12( )的结果 */

本文转自
http://202.113.32.136/jsjjp/class_online/right1007.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值