C有5种不同的存储模型、或称存储类
存储时期:变量在内存中保留的时间
作用域和链接:一起表明程序的哪些部分可以通过变量名来使用该变量。
作用域:描述了程序中可以访问一个标识符的一个或者多个区域
| 分类 | 描述 |
作用域 | 代码块作用域 | 在代码块定义的变量 |
函数原型作用域 | 从变量定义处一直到原型声明的末尾 | |
文件作用域 | 一个在所有函数之外定义的变量 | |
链接 | 外部链接 | 可以在一个多文件程序的任何地方使用 |
内部链接 | 可以在一个文件的任何地方使用 | |
空链接 | 具有代码块作用于或者函数原型作用域的变量有空连接,意味着他们是由其定义所在代码块或者函数私有。 | |
存储时期 | 静态存储时期 | 具有文件作用域的变量,变量的位置固定不变 |
自动存储时期 | 具有代码块作用域的变量 |
存储类 | 时期 | 作用域 | 链接 | 声明方式 |
自动 | 自动 | 代码块 | 空 | 代码块内 |
寄存器 | 自动 | 代码块 | 空 | 代码块内,使用关键字register |
具有外部链接的静态 | 静态 | 文件 | 外部 | 所有函数之外 |
具有内部链接的静态 | 静态 | 文件 | 内部 | 所有函数之外,使用关键字static |
空连接的静态 | 静态 | 代码块 | 空 | 代码块内,使用关键字static |
自动变量
只有变量定义所在的代码块才可以通过名字访问该变量,程序进入包含变量的代码块时候,变量才开始存在。
最常见的存储类,就是日常在main或者函数中的,int n;可以在前面加存储类说明符auto来说明,例如 auto int n
寄存器变量
基本和自动变量相同,只是寄存器变量是多存放在一个寄存器里,而非内存中,所以无法获得寄存器变量的地址。声明一个寄存器类变量仅仅是一个请求,而非一条命令。
具有代码块作用域的静态变量(空链接的静态变量 )
这些变量和自动变量具有相同的作用域,但当包含这些变量的函数完成工作时,它们并不会消失。
具有外部连接的静态变量
把变量的定义声明放在所有函数之外,即创建了一个外部变量
在使用换这个外部变量的函数中通过使用extern关键字来再次声明他。
外部变量的作用域:从声明的位置开始到文件结尾为止。无static
外部变量将自动被赋初值0.
具有内部链接的静态变量
把变量的定义声明放在所有函数之外,但需要用存储类说明符static声明
内存分配函数
函数 | 说明 | 例子 | 特性 |
Malloc() | Malloc(字节数) | Double *ptd; Ptd=(double *)malloc(30 * sizeof(double)); | 返回那块内存第一个字节的地址 |
Calloc() | Calloc(单元数量,单元字节数) | Long *newmem; Newmem=(long *)calloc(100,sizeof(long)); | 将块中全部为都设置为0 |
Free() | Free(指针) | Free(ptd) |
|
类型限定词const
Const int nochange; Nochange=12; | 不能给nochange赋值12 |
Const int nochange=12; | 合法 |
指针中的const
Const float *pf; | Pf本身的值可以改变,但指向的值不变 |
Float * const pt; | 总是指向同一个地址,但所指向的值可以改变 |
Const float * const ptr | 总是指向同一个地址,所指向的值不变 |
Const const * pfc; | 等价于Const float *pfc; |