「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」
生存期
-
生存期
-
C语言的变量拥有两种生存期
- 静态存储期
- 自动存储期
- 具有文件作用域的变量属于静态存储期(全局变量和函数),函数也属于静态存储期。属于静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放。
- 具有代码块作用域的变量一般情况下属于自动存储期。属于自动存储期的变量在代码块结束时将自动释放存储空间。
-
存储类型
-
存储类型
-
存储类型其实是指存储变量值的内存类型,C语言提供了5中不同的存储类型;
-
auto(自动变量)
- 在代码块中声明的变量默认的存储类型就是自动变量(自动存储期),使用关键字auto来描述。
- 由于这是默认的存储类型,所以不写auto是完全没问题的。
- auto int a;等价int a;
-
register(寄存器变量)(注:寄存器存在于cpu内部)
- 将一个变量声明为寄存器变量,那么该变量就有可能被存放在cpu的寄存器中。(为什么是有可能,因为cpu的寄存器空间十分有限,编译器不可能让你为所欲为,编译器有一套自己的优化方法)
- 寄存器变量和自动变量在很多方面是一样的,它们都拥有代码块作用域,自动存储期和空链接属性。
-
不过这里有一点需要注意的是:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。(因为cpu寄存器的地址默认是不允许获取的,如果这样做会报错)
- 举例(访问寄存器地址直接报错)
- 举例(访问寄存器地址直接报错)
-
static
- 使用static来声明局部变量,那么就可以将局部变量指定为静态局部变量。
- static使得局部变量具有静态存储期,所以它的生存期和全局变量一样,指导程序结束才释放。
- 举例(使用static)
- 结果(使用static)
- 结果(不使用static)
- 注:static没有改变作用域
-
extern
-
static和extern
- 作用于文件作用域的static和extern,static关键字使得默认具有external链接属性的标识符变成internal链接属性,而external关键字是用于告诉编译器这个变量或函数在别的地方已经定义过了,先去别的地方找找,不要着急报错。
-
总的来说extern和auto也有点类似
-
举例(不写这两个extern同样没问题)
- func.c
- main.c
- func.c
- 结果
-
-
- typedef
-
-