C语言——存储时期

来源:互联网 发布:在线简谱制作软件 编辑:程序博客网 时间:2024/05/17 02:19

一个C变量有两种存储时期:静态存储时期(static storage duration)和自动存储时期(automatic storage duration)

        如果一个变量具有静态存储时期,他在程序执行期间将一直存在。具有文件作用域的变量具有静态的存储时期。注意对于具有文件作用域的变量,关键词static表明链接类型,并非存储时期。一个使用static声明了的文件作用域变量具有内部链接,而所有的文件作用域变量,无论他具有内部链接还是具有外部链接,都具有静态存储时期。

        具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定义这些变量的代码块时,将为这些代码分配内存;当退出这个代码块的时候,分配的内存将被释放。该思想把自动变量使用的内存视为一个可以重复使用的工作区或者暂存内存。迄今为止我们用到的局部变量都是自动类型的。

       1. 寄存器变量:通常变量被存储在内存中,如果幸运的话,寄存器变量可以被存储在CPU的寄存器中,或者更一般的可以存储在速度最快的可用内存中,从而比普通变量跟快的被访问和操作。因为寄存器变量多是存放在一个寄存器而非内存中,所以无法获取寄存器变量的地址,但在其他的许多方面,寄存器变量与自动变量是一样的。

        register int quick;

这里是将quick声明为寄存器变量,但是这并不是一个命令,只是一个请求,所以编译器必须在请求和可用的寄存器中进行比较,如果可以满足的话就会分配寄存器内存,但是如果不能满足那那quick就是普通的自动变量,但是任然不能对他使用地址运算符。可以使用寄存器声明的类型是有限的,例如double就不能用寄存器来容纳。

        2.具有内部链接的静态变量:“静态”是指变量的位置是固定不动的,具有文件作用域的变量自动(也是必须的)具有静态存储时期;也可以创建具有代码块作用域兼具静态存储的局部变量。这些变量和自动变量具有相同的作用域,但当包含这些变量的函数完成工作时。它们并不会消失。也就是说变量具有代码作用域、空连接,却有静态的存储时期。存一次函数调用到下一次函数调用,计算机都记录这它们的值。(对于函数参量不能使用static)

        3.具有外部链接的静态变量:具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。把变量的定义声明放置在所有函数之外,即创建一个外部变量。为了使程序更加清晰,可以在使用外部变量的的函数中使用extern关键词再次声明它。如果变量在别的文件中定义的,使用extern来声明是必须的。与内部变量不同的是,外部变量会自动进行初始化,初始化为0,但是自动变量不初始化就会执行空间中的数,而不会自动赋值为0.

        第一声明的时候是“定义声明”(defining declaration),第二次声明是“引用声明”(referencing declaration)。关键字extern表明这个声明不是一个定义,以为他指示编译器参考其他地方,当使用exern关键词的时候表明真正的定义是在程序的其它的地方,或者是在其他的文件中,不会为变量分配空间,所以不要用extern来进行外部的定义,只用它来引用一个已经存在的外部定义,一个外部变量只能进行一次初始化,而且一定是变量被定义时。

0 0
原创粉丝点击