C语言5种存储类别
存储类别 | 声明方式 | 存储期 | 作用域 | 链接 |
---|---|---|---|---|
自动 | 块内 | 自动 | 块 | 无 |
寄存器 | 块内,使用关键字 register | 自动 | 块 | 无 |
静态外部链接 | 所有函数外 | 静态存储 | 文件 | 外部 |
静态内部链接 | 所有函数外,使用关键字 static | 静态存储 | 文件 | 内部 |
静态无链接 | 块内,使用关键字 static | 静态存储 | 块 | 无 |
- 自动变量
***块作用域和无链接意味着只有在变量定义所在的块中才能通过变量名访问该变量。
***变量具有自动存储期意味着,程序在进入该变量声明所在的块时变量存在,程序在退出该块时变量消失。 - 寄存器变量
寄存器变量储存在 CPU 的寄存器中,或者概况地说,储存在最快的可用内存中访问和处理变量速度更快。 - 块作用域的静态变量
静态变量是指该变量在内存中原地不动,并不是说它的值不变。 - 外部链接的静态变量(external variable)
通过用关键字 extern 再次声明,指出使用了外部变量。
外部变量只能初始化一次,且必须在定义该变量时进行。 - 内部链接的静态变量
在所有函数外部,用存储类别说明符 static 定义的变量为静态变量。
内部链接的静态变量只能用于统一个文件中的函数。可以使用 extren 在函数中重复声明任何具有文件作用域的变量。 - 多文件
如果外部变量定义在一个文件中,那么其他文件在使用该变量之前必须先声明它(使用 extern 关键字)。 - 存储类别说明符
C语言有6个关键字作为存储类别说明符:auto、register、static、extern、_Thread_local、typedef.
typedef 关键字与任何内存存储无关。
auto:表明变量是自动存储期,只能用于块作用域的变量声明中。使用 auto 主要是为了明确表达要使用与外部变量同名的局部变量的意图。
register:只用于块作用域的变量,它把变量归为寄存器存储类别,请求最快速度访问该变量。同时,确保该变量地址不被获取.
static: 创建的变量具有静态存储期,载入程序时创建对象,当程序结束时对象消失。
extern: 表明声明的变量定义在别处。 - 存储类别和函数
包括外部函数(默认)或静态函数(用 static 标识) - 分配内存:malloc()和 free()、calloc()
动态申请内存malloc(20*sizeof(int))、calloc(20, sizeof(int)) ,free()函数释放 malloc 和 calloc函数申请的内存空间,不及时释放内存会造成内存泄露。不能释放同一内存两次。 - const 类型限定符
以关键字 const 声明的对象,其值不可修改。
const float *pf; pf 指向一个 float 类型的 const值。 创建 pf指向的值不能被改变,而 pt 本身的值可以改变。
float *const pt; pt 是一个const 指针,创建的指针 pt 本身的值不能更改。
const float *const ptr;表明 ptr 既不能指向别处,它所指向的值也不能改变。 - volatile类型限定符
volatile限定符告知计算机,代理(而不是变量所在的程序)可以改变该变量的值。 - restrict 类型限定符
restrict 关键字编译器优化某部分代码已更好地支持计算。它只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。