const修饰普通变量
//const修饰data为只读变量,data的本质是变量
//只读变量只能被初始化,不能被赋值
const int data=100;
data=10;//err
如果以常量初始化const修饰的只读变量,那么只读变量的值事先存放在“符号常量表中”不会立即给data开辟空间
当对data取地址时,系统才会为data开辟空间
const int data=100;
int *p=(int *)&data;
*p=2000;
cout<<"*p="<<*p<<endl;//2000
cout<<"data="<<data<<endl;//100
data事先保存在符号常量表中,当对data取地址时,才为data开辟了空间,接着修改了data所指向的地址空间的值为2000,所以当取data的值时,还是会从符号常量表中取data的值100,而data开辟的空间的值已经变成了2000。
如果以变量初始化const修饰的只读变量,那么只读变量会立即开辟空间(没有符号常量表)
int a=10;
const int data=a;//以变量初始化data
int *p=(int *)&data;
*p=2000;
cout<<"*p="<<*p<<endl;//2000
cout<<"data="<<data<<endl;//2000
const修饰自定义类型的变量立即开辟空间(没有符号常量表)
register修饰寄存器变量
如果变量特别高频繁使用,会自动将变量存储在寄存器中,目的时提高访问效率
如果用户想将变量直接放入寄存器中可以加register修饰
register int data=0;//data将放入寄存器中
//尽量不要对寄存器变量取地址
&data;
//register修饰的变量,只是尽量放入到寄存器中
volatile关键字
强制访问内存,从内存中读取数据而不是寄存器或是其它地方
volatile int data=0;//对data的访问必须从内存访问
防止编译器优化
sizeof测量类型的大小
cout<<sizeof('a')<<endl;//1B
cout<<sizeof(10)<<endl;//4B
cout<<sizeof(short)<<endl;//2B
cout<<sizeof(long)<<endl;//32位平台 4B
cout<<sizeof(float)<<endl;//4B
cout<<sizeof(double)<<endl;//8B
typedef给已有的类型重新取个别名
不能创建新类型,只是将长且复杂的类型名取一个短小的名称。
步骤:
- 先用已有的类型定义一个普通的变量
- 用别名替换变量名
- 在真个表达式最前方加typedef
//INT32就是int类型的别名
typedef int INT32;
INT32 data;
int num;//已有的类型仍然有效
例1:给int arr[5]取个别名
typedef int MYARRAY[5];
MYARRAY arr;
例2:给int *取个别名
typedef int *MYP;
MYP p;//int *p;p的类型就是int *类型
转义字符
'\0' == ASCII 为0
'\n' == 换行符
'\t' == tab缩进符
'\r' ==回到行首符号
'\a' ==发出警报
八进制转义:\ddd' 每个d的范围必须是0~7 3个d表示最多识别3位八进制数据,如'\123'
十六进制转义:'\xhh' 每个h的范围0~9 a~f 2个h表示最多识别2位十六进制,如'\xab'