C语言程序设计 变量的存储类别

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.2 变量的存储类别
变量作用域从空间的角度定义了变量在程序中可以使用的范围。除了范围这个空间维度 外,变量也有时间维度。时间维度指的是一个变量占用存储时间的长短,也称为变量的生命 周期。一个变量存储在哪,存储多长时间,都是由存储类别来决定的。
1.局部变量的存储类别
局部变量可以使用 auto、static 和 register 三种存储类。
注意,虽然局部静态变量存在静态存储区,它的初始化由编译器建立,在程序运行过程 中始终存在,但它毕竟是局部变量,所以只能在定义它的函数内可以使用。
2.全局变量的存储方式
全局变量定义在所有函数之外,为了使定义的全局变量能够被定义所在的 C 源文件中的 所有函数访问,一般把全局变量定义在 C 源文件的开头。定义全局变量时可以使用的关键 字是 static 和 缺省 ,由于全局变量总是在程序编译、连接时被安排在静态存储区,生命 期最长,程序运行过程中全局变量始终占用静态存储区中某个对应的存储空间,故在全局变 量定义时使用关键字 static 或缺省并不决定全局变量作用时间的长短,但是决定了全局变 量的作用范围大小。
执行调用函数 fun1 中每次都执行了把值 1 赋于分配给变量 f 的存储空间的指令,产生了
以上的第一行显示输出结果。
(2) 函数 fun2 中的变量 f 在定义时使用了关键字 static 指定的存储类别,它被编译
程序理解为是长生命期的局部变量,在程序编译、连接时为它在静态存储区分配存储空间,
并将该变量初始化为 1。而在程序执行时,执行到主函数中第二个 for 语句要三次调用函数 fun2 ,在每次进入函数 fun2 时,也是系统在动态存储区给形参 x 分配临时的存储空间, 并执行指令把实参传递给形参 x,在每次退出函数 fun2 时系统只收回分配给形参 x 存储 空间。而函数 fun2 中的局部变量 f 是用存储类别 static 指明的局部变量,它的存储空 间是在程序编译、连接时分配在静态存储区并对完成初始化(有些编译器是在第一次执行该 定义语句时进行内存分配),在三次执行调用函数 fun2 中使用变量名 f 访问的都是在程 序编译、连接时分配在静态存储区的同一个存储空间,并且在整个程序的执行期间,该存储 空间不会被作其它用途,再次进入函数 fun2 时该存储空间的内容就是上次退出该函数时的 内容,故产生了以上的第二行显示输出结果。
存储空间,故不会对该变量初始化。在程序执行时,主函数中第一个 for 语句要三次调用
函数 fun1 ,在每次进入函数 fun1 时,系统在动态存储区给形参 x 和局部变量 f 分配临
时的存储空间,并执行指令把实参传递给形参 x,把值 1 赋于变量 f,称为运行时初始化,
在每次退出函数 fun1 时系统收回分配给形参 x 和局部变量 f 的存储空间。正因为在三次
(1) 自动变量 用关键字“auto”作存储类型说明的是自动变量,自动变量在动态存储区内分配空间。 “auto”也可以省略,前面的很多例题中凡未加“auto” 说明的变量,又无其它存储形式 说明的,均属动态存储。如在某函数中有定义: int a; auto float b; 则 a,b 都是自动变量。对于定义在函数中的某个变量,虽然该函数在程序执行中被多 次调用,但每次调用后该变量的内容不需要保留给以后再次调用该函数时使用,这个变量就 应该被定义成自动变量。自动变量是短生命期的局部变量,安排在动态存储区,由系统自动 分配和释放,用到时分配内存,不用时释放内存,以节省程序执行时的内存资源。 (2) 局部静态变量 用关键字 static 加以说明的局部变量为局部静态变量。局部静态变量在静态存储区分 配空间。 定义在函数中的某个变量,若该函数在程序执行中被多次调用,并且调用后该变量的内 容需要保留给以后再次调用该函数时使用的,这个变量就应该被定义为局部静态变量。局部 静态变量是长生命期的局部变量。尽管该函数执行结束,但变量的内容需要保留,也就是分 配给该变量的存储区的内容需要保留,这个存储区不能被作它用。因此,局部静态变量只能 安排在静态存储区。 (3) 寄存器变量 用关键字 register 说明的局部变量为寄存器变量。寄存器变量的值存放在 CPU 的寄存 器中。这样,可以提高程序的执行效率。寄存器数目有限,不能任意定义,有的小型机准许 使用 3 个寄存器来容纳寄存器变量。 【例 7-4】局部变量存储方式举例,分析下面程序运行结果:
static int f = 1;
return ( f *= x ); }
程序执行结果为:
fun1(2)=2
fun1(3)=3
fun1(4)=4
fun2(2)=2
fun2(3)=6
fun2(4)=24
wk.baidu.com
上例程序中函数 fun1 和 fun2 除局部变量 f 定义时的存储类别有区别外(函数 fun1
中的变量 f 定义成 auto 存储类型,函数 fun2 中的变量 f 定义成 static 存储类型),
/*程序名:7_4.c*/ /*功能:局部变量存储方式示例*/ #include<stdio.h> int fun1( int ); int fun2( int );
int main() {
int i;
for(i = 2 ; i < 5 ; i++) printf ("fun1(%d) = %d \t ", i , fun1( i ) );
其它语句全部相同,但程序执行时主函数 main 三次以相同的参数调用函数 fun1 和 fun2
却产生不同的结果,这完全是由于定义在被调用函数中的变量的存储类别不同引起的。
(1) 函数 fun1 中的变量 f 在定义时使用缺省的存储类别,它被编译程序理解为是短
生命期的局部变量,在程序编译、连接时不为它分配存储空间,并由于此时该变量还没有其
printf("\n"); for(i = 2 ; i < 5 ; i++)
printf ("fun2(%d) = %d \t ", i , fun2( i ) ); printf("\n");
return 0; }
int fun1( int x ) {
int f = 1;
return ( f *= x ); } int fun2( int x ) {
相关文档
最新文档