自动变量:
局部变量:定义在代码段{}中的变量,生命周期与作用域就在其所在的代码段内
自动变量默认有auto修饰,auto是自动变量的声明符,
静态变量:
存储在静态区/静态全局区/静态存储区:内存特点是定义时自动初始化为0,生命周期是整个程序,运行时在加载资源阶段分配空间
全局变量:定义在全局位置,是静态变量
全局变量与局部变量重名时,在局部变量的作用域内,局部变量生效
全局变量的初始化只能用常量初始化
所有文件中都可用,声明可以在所有文件中声明
全局变量不能在头文件中定义
存储类说明符(一个变量不能出现两个存储类说明符)
auto、extern、static、register、typedef
外部变量extern:一般在声明中使用,变量存储在静态区
extern int e = 12;//作用是将定义的变量定义成外部变量,可以在全局声明(可不加),也可以在局部声明(必须加)
静态变量static:
定义在全局时只在所在文件内有效,别的文件用不了
定义在局部时必须用常量赋值,作用域在局部,生命周期是整个程序,在不同的作用域中可以重名
寄存器变量register(寄存器变量不能取地址)
寄存器变量不要定义成全局变量
类型限定词
常量修饰符const(将被修饰的变量变成常量,不能被二次修改)
const int a=1;
int const b=2;//两种写法都对
本质是改变了地址的类型
const修饰指针
int a;
const int* p=&a;//修饰的是*p,即不能操作*p
int const *p1=&a;//同上
int * const p2=&a;//修饰的是p2,即不能操作p2
const作为函数参数表示不允许修改
volatile(易变的变量):在程序运行中,多次调用同一个变量时,系统该变量会进入缓存器中,使用volatile,就不会让系统将该变量放入缓存器中
restrict可优化的操作:只能用于指针,表示该指针是访问对应空间的唯一且初始的方式
int * restrict p=(int*)malloc(sizeof(int)*5);