文章目录
作用域
作用域描述了程序中可以访问一个标识符的一个或多个区域
- 块作用域
- 一对花括号括起来的区域,定义在块中的变量有块作用域
- 函数的形式参数也属于块作用域
- 局部变量具有块作用域
- 函数作用域
- 仅限于goto语句
- 即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数
- 函数原型作用域
从形参定义到原型声明结束 - 文件作用域
- 变量定义在函数外面,具有文件作用域
- 从它定义的位置开始,到文件结束
- 也称为全局变量
链接
具有文件作用域的变量可能有外部或者内部链接
- 外部链接
可以在一个多文件程序的任何地方使用 - 内部链接
只能在一个翻译单元(一个源代码文件和它所包含的头文件)中使用
需要注意定义与头文件包含的顺序问题,需要先定义后包含,头文件才能使用相应的变量
内部链接不能用extern声明 - 空链接
代码块作用域、函数作用域、函数原型作用域的变量有空链接
意味着它们是由其定义所在的代码块或者函数原型私有的
存储时期
- 静态存储期
程序执行期间一直存在 - 线程存储期
从被声明到线程结束一直存在 - 自动存储期
块作用域的变量通常具有自动存储期
进入块时分配空间,退出时释放空间 - 动态分配存储期
自动变量
自动存储期,块作用域,无链接
关键字:auto
如果编写兼容c++的程序,最好不要用auto关键字
寄存器变量
块作用域,无链接,自动存储期
关键字:register
请求成功则获得寄存器变量
失败则获得存储在内层的普通变量
函数的存储类别
外部函数
默认是外部函数
可以被其它文件访问
静态函数
只能用于所定义的文件
内联函数
定义在头文件中,可以重复包含
malloc
void *malloc(size_t size);
传入要分配的字节数,返回分配的地址,失败返回NULL
calloc
void *calloc(size_t n, size_t size);
分配N个 大小为SIZE的空间,并且全部初始化为0
free
释放分配的空间,否则造成内存泄漏
ANSI 类型限定符
const
定义普通变量时,该变量不能被改变
定义指针时,在*
左侧,则指向的值不能被改变
在*
右侧,则指向不能被改变
volatile
通常用于硬件地址,以及在其它程序或同时运行的线程中共享数据
restrict
允许编译器优化某部分的代码以更好的支持计算
它只能用于指针,表明该指针是访问数据对象的唯一方式
_Atomic
当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象
幂等
C99为类型限定符增加了幂等性,可以在一条声明中多次使用同一个限定符,多余的限定符将会被忽略
const const const const int a=10;
const int a = 10;
以上是等价的