任务描述
前面讨论过变量的分类方式:按照数据类型分类、按照作用范围分类等。通过对本任务的学习,要求掌握按照变量作用时间来分类:静态存储方式和动态存储方式等。
知识学习
(1)动态存储方式与静态动态存储方式
前面已经介绍了,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。
从另一个角度,从变量值存在的时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
①静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
②动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。
用户存储空间可以分为3 个部分:
①程序区。
②静态存储区。
③动态存储区。
局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序运行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。
动态存储区存放以下数据:
①函数形式参数。
②自动变量(未加static 声明的局部变量)。
对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。
在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。
(2)auto 型变量
函数中的局部变量,如不专门声明为static 存储类别,系统都是动态地分配存储空间的,aotu 型变量数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字auto 作存储类别的声明。
例如:前面学习过的输入n 的值,求n!。
(www.xing528.com)
n 是形参,n,y 是自动变量,对n 输入值后。执行完f 函数后,自动释放f 函数的n 变量所占的存储单元。当整个程序运行结束并关闭后main 中的n 和y 变量所占的存储单元也自动释放。
其中关键字auto 可以省略,auto 不写则隐含定为“自动存储类别”,属于动态存储方式。
(3)用static 声明局部变量
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static 进行声明。
例5.18 考察静态局部变量的值。
说明:循环第1 次调用f 函数时,实参a=10 的值传递给形参a,然后根据a、b、c 的值分别做自增,分别自增操作后a=11、b=21、c =31,求和结果是63,将其返回并输出。循环第2 次调用f 函数时,由于a 和b 默认是auto 型,而c 是static 型。其中a 和b 都重新划分存储空间,而c 的存储一直没变且没有释放。所以第2 次结果是a=11、b=21、c =32,求和结果是64,将其返回并输出。最后循环第3 次同理,结果是a =11、b =21、c =33,求和结果是65,将其返回并输出。但是staic 型变量还是会在整个程序运行并结束后才会释放所占内存空间,程序运行结果如图5.19所示。
图5.19 例5.18 程序运行结果
(4)register 变量
为提高效率,C语言允许将局部变量的值放在CPU 中的寄存器中,这种变量称为“寄存器变量”,用关键字register 作声明。
例5.19 使用寄存器变量,输出1 到5 的所有阶乘。
图5.20 例5.19 程序运行结果
说明:
①只有局部自动变量和形式参数可以作为寄存器变量。
②一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量。
③局部静态变量不能定义为寄存器变量。
任务总结
静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量、全局动态变量都是静态存储。动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式不同而产生的特性称为变量的生存期。
静态存储只会初始化一次。定义或者声明变量时,没有static 修饰符的就是动态变量,有static 修饰符的就是静态变量。动态全局变量可以通过extern 关键字在外部文件中使用,但静态全局变量不可以在外部文件中使用。静态全局变量相当于限制了动态全局变量的作用域。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。