第12章 C语言中用户标识符的作文域和存储类 12.2 局部变量及其作用域和生存期
讨论本章
- 知识点:
- 12.2.1 auto变量
- 12.2.2 register变量
- 12.2.3 静态存储类的局部变量
- 12.2.4 引用结构体变量中的数据
- 12.2.5 函数之间结构体变量的数据传递
- 12.2.6 利用结构体变量构成链表
当在函数内部或复合语句内定义变量时,如果没有指定存储类,或使用了aut0说明符,系统就认为所定义的变量具有自动类别。因此:
float a;
就等价于:
auto float a;
auto变量的存储单元被分配在内存的动态存储区。每当进入函数体(或复合语句)时,系统自动为auto变量分配存储单元;退出时自动释放这些存储单元另作他用。因此,这类局部变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止。
寄存器变量也是自动类变量,它与auto变量的区别仅在于:
用register说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是像一般变量那样,占内存单元。程序运行时,访问存在于寄存器内的值要比访问存于内存中的值快得多。
因此当程序对运行速度有较高要求时,把那些频繁引用的少数变量指定为register 变量,用助于提高程序的运行速度。
当在函数体(或复合语句)内部用static来说明一个变量时,可以称该变量为静态局部变量。静态局部变量的作用域仍与aut0、register类的变量一样,但它与后两者有两点本质上的区别:
(1)在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留,因而可以继续使用存储单元中原来的值。由此可知,静态局部变量的生存期将一直延长到程序运行结束。
(2)静态局部变量的初值是在编译时赋予的,不是在程序执行期间赋予(自动变量是在程序执行过程中赋初值)。对未赋初值的静态局部变量,C编译程序自动给它赋初值0。
静态局部变量的上述特点,对于编写那些在函数调用之间必须保留局部变量值的独立函数是非常有用的。