define和typedef使用时:
#define int* int_p int_p a,b 定义变量时 只有a的类型是int*
typedef int* int_t int_t a,b 定义变量时 a和b都是int*类型
声明对应的编译器,有两个含义:
1.告诉编译器,这个声明的名字已经匹配到同一内存上了
2.告诉编译器,声明的名字已经被占用了,别的地方不能再出现
定义和声明最重要的区别就是,定义开辟了内存,声明还没有开辟内存
extern 外部定义关键字,如果我们想使用一个变量,但是这个变量声明在下面,或者别的文件里声明或定义了,那么用extern就能可以拿来使用这个变量
修饰const类型变量时,也必须在源文件声明里加上extern才行,比如:extern const int a
static关键字
在C语言中修饰变量和函数,但在C++中修饰的有其他用法
修饰全局变量时,说明该变量只能在此程序中使用,本文件使用(作用域受限,生存期不变)
修饰局部变量时,说明该变量只能在第一次调用函数的时候初始化,再次调用该变量保存的是上一次调用后的值 (作用域不变,生存期受限)
修饰函数时,说明该函数只能在此程序中使用,本文件使用(作用域受限,生存期不变)
static修饰的变量放在.data区里,整个main函数结束,才消失,它会默认初始化0,在C语言中必须拿常量进行静态变量初始化(C++可以那变量初始化)
const 修饰的变量不可改,恒定不变,只能读不能写
无论修饰的是全局变量还是局部变量修饰的时候都必须初始化赋值
register寄存器关键字
register建议编译器尽可能将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率,如果一个变量被register修饰,意味着该变量作为寄存器变量,让该变量的访问速度达到最快 如果把数据存放在主存储器中运行的就会慢,如果放入寄存器在通过CPU运行就会变得快
限制:1.register修饰变量必须是能被CPU所结束,必须是单个值,并且长度小于等于int长度
2.register可能不存放内存中,所以不能用取地址符&来获取变量地址
3.只有局部变量和形参可以作为寄存器变量
4.局部静态变量不能定义寄存器变量(生存期太长一直占着寄存器)
5.由于寄存器数量有限,不能定义任意多个寄存器变量
CPU寄存器
32位操作系统只能存32个4字节
eax ebx ecx edx