-
生存期
C语言变量拥有两种生存期,分别是静态存储期(static storage duration)和自动存储期(automatic storage duration)。具有文件作用域的变量具有静态存储期(比如全局变量),函数名也具有静态存储期。具有静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放;具有代码块作用域的变量一般情况下具有自动存储期(比如局部变量和形式参数),具有自动存储期的变量在代码块结束时将自动释放存储空间。
-
存储类型
前边我们分别介绍了C语言变量的作用域、连接属性和生存期,总得来说,这些都是由变量的存储类型来定义的。变量的存储类型其实是指存储变量值的内存类型,C语言提供了5种不同的存储类型,分别是:auto、register、static、extern 还有typedef。 -
自动变量(auto)
在代码块中声明的变量默认的存储类型就是自动变量,使用auto关键字来描述。所以函数中的形参、局部变量,包括复合语句的定义局部变量都具有自动变量属性。自动变量拥有代码块作用域,自动存储期和空链接属性。 -
寄存器变量(register)
寄存器是存在于CPU的内部的,CPU对寄存器的读取和存储可以说是没有任何延迟的。将一个变量声明为寄存器变量,那么该变量可能被存放于CPU的寄存器中。因为CPU的空间是十分有限,所以编译器并不会让你将所有声明为register变量都放到寄存器中。事实上,有可能所有的register关键字都忽略,因为编译器有自己的一套优化方法,会权衡哪些才是最常用的变量。在编译器看来它觉得它比你更了解程序。被忽略的register变量,会成为普通的自动变量。 所以寄存器变量和自动变量很多方面是一样的, **他们都拥有代码块作用域,自动存储期和空链接属性**
-
静态局部变量
static用于描述文件作用域的变量和函数时候,表示将其链接属性重external修改为internal,它的作用范围就是仅当前源文件可以访问。但是如果将static描述局部变量,那么效果就会不一样。默认情况下,局部变量是auto存储类型,如果使用static来声明,那么就可以将局部变量指定为静态局部变量。static使得局部变量具有静态存储期。所以他的生存期与全局变量一样,直到程序结束才释放。 **注意只改变了生存期,没有改变作用域**。
-
static和extern
作用于文件作用域的static和extern,extern关键字是用于告诉编译器,这个函数或变量在别的地方定义过的,先去别的地方找,不要报错。
生存期和存储类型
最新推荐文章于 2023-07-02 16:37:14 发布