一、auto
在缺省的情况下,编译器默认所有的变量都是auto的。
二、register
1、请求编译器尽可能地将变量存在CPU内部的寄存器中,而不是通过内存寻址方式,以此来提高效率。
2、注意事项:register变量必须是一个单个的值,并且其长度应小于或等于整形的长度;而且不能用取址运算符“&”来获取register变量的地址(因为该变量可能不放在内存中)。
三、static
1、修饰变量:
静态全局变量:其作用域从定义之处开始,到文件结尾处结束。
静态局部变量:由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的也不会被销毁,函数下次使用时仍然用这个值。
最终i=10,j=1
2、修饰函数:用来表示不能被其他文件访问的全局变量和函数。
四、基本的数据类型short、int、long、char、float、double
在32位系统上,short的内存大小是2字节,char是1字节……可能不同的平台会有所不同,具体平台使用sizeof关键字测试。
五、sizeof
1、sizeof是关键字不是函数,在计算变量所占空间大小时,括号可以省略,而计算类型大小时则不能省略。
2、经典例子,32位系统 VC++6.0编译器下的结果
六、signed、unsigned
1、缺省的情况下,编译器默认数据为signed
2、经典例子
七、if 、else
注意else与离他最近的那个if配对
八、switch、case
1、case语句绝对不能忘了加break,最后必须使用default
2、case后面只能是整型或字符型的常量,注意:不能试const修饰的变量,因为其实质为只读变量。 (在C++中对const进行了拓展,则可以使用const修饰的变量)
九、do、while、for循环
十、break、continue
1、break终止本层循环
2、continue终止本次(本轮)循环
十一、goto关键字——最好不用
十二、void
1、void * 可以指向任何类型的数据,因此,任何类型的指针都可以直接给它赋值,无需进行强制类型转换。但是,void * 不可以直接赋值给其他类型的指针,需要进行强制转换。
2、如果函数无参数,最好声明其参数为void
十三、return
1、用来终止一个函数并返回其后面跟的值。
2、不可返回指向“栈内存”的指针,因为该内存在函数体结束时被自动销毁。
十四、const
1、const修饰的变量并非常量而是只读变量,所以不能使用在case语句后面。
2、编译器通常不会为const只读变量分配内存,而是将它保存在符号表里,节省空间,同时提高了效率。
3、修饰指针时:忽略类型名,const离谁最近就是修饰谁
const int *p // const修饰的是*p,即指针指向的对象不可变
int const *p //同上
int * const p //const修饰p,p不可变
const int * const p // 指针p和它指向的对象均不可变
十五、volatile
1、用它修饰的变量可以被某些编译器未知的因素更改;编译器对访问该变量的代码不进行优化,从而可以提供对特殊地址的固定访问。
2、例子解析
int i = 10;
int j = i; //编译器从内存中取出i的值赋给j,这个值并没有丢弃
int k = i; //在该语句编译器继续使用刚才i的值赋给k,并不需重新从内存取
volatile int i = 10; //volatile关键字告诉编译器i的值可能随时发生变化
int j = i; //所以每次使用它的时候都要从内存中取出i的值
int k = i;
3、注意:当const与volatile同时修饰一个变量时,一般编译器会优先于const,将该变量认为是const只读变量。
十六、extern
extern 修饰的函数或者变量,表明变量或函数的定义在别的文件中。
十七、struct
1、结构体所占的内存大小是其成员所占内存之和
十八、union
1、union中所有的数据成员共用一个空间,所有的数据成员具有相同的起始地址;只配置一个足够大的空间来容纳最大长度的数据成员。
2、大端、小端模式对union类型数据的影响
大端模式:字数据的高字节存储在低地址中,低字节存储在高地址中
小端模式:字数据的高字节存储在高地址中,低字节存储在低地址中
测试系统的模式:
十九、enum——枚举类型
1、enum变量类型可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依此加1;如果没有赋值,它们的值从0开始依次递增1。
2、在32位系统中其默认类型的大小为4字节。
二十、typedef
给一个已经存在的数据类型取一个别名,而非定义一个新的数据类型。