1、定义和声明
定义:创建了对象并且为该对象分配内存并给该对象取上名字(该名字就是变量名或者对象名),注意:名字一旦和这块内存匹配起来,就同生共死,不离不弃,并且这块内存的位置也不能被改变。
声明:没有分配内存,只是告诉编译器,这个名字已经被预定了,别的地方不能再使用它作为变量名和对象名。
extern int a; //声明
int a; //定义
2、皇帝身边的小太监——寄存器register
这个关键字请求编译器尽可能地将变量存在CPU内部寄存器中,而不是通过“内存寻址访问”,因此可以提高效率。
一个CPU的寄存器数量有限,也就几个或者几十个,因此不可能把所有变量全放入到寄存器。
【举例】
小太监是皇帝和大臣之间数据传递的桥梁。
寄存器是CPU和内存之间数据传递的桥梁。
数据从内存里拿出来先放到CPU内部寄存器,然后CPU再从寄存器里读取数据来处理,CPU处理完数据后同样把数据通过寄存器存放到内存中,CPU不直接和内存打交道。
寄存器其实就是一块一块小的存储空间,只不过存取速度要比内存快得多。
【注意】
因为register变量可能不存放在内存中,所以不能用取址运算符&来获取register变量的地址
3、static在C中的几个含义
(1)修饰变量:
__________________________作用域
static全局变量:从定义之处开始,到文件结尾处结束(限制在定义的文件中,即使使用关键字extern也不能把作用域扩展到别的文件);在定义之处前面的代码行也不能使用它,但是可以用extern扩展到前面的某个代码行处。
static局部变量:在函数体里面定义,就只能在该函数体里使用。
(2)修饰函数
static不是指存储方式,而是对函数的作用域仅局限于本文件,该函数不能被其他文件访问。
4、考点:与“零值”进行比较
① bool变量与“零值”进行比较
if(bool == 0) if(bool == 1)//不好,让人误以为是整型变量
if(bool == FALSE) if(bool == TRUE)//TRUE的值不一定都是1
if(!bool) if(bool) //最好的写法
②float变量与“零值”进行比较
if(float == 0.0) if(float != 0.0)//不好,没有精度
if((float >= -EPSION)&&(float <= EPSION))//EPSION为定义好的精度,好
③指针变量与“零值”进行比价
if(p == 0) if(p != 0) //不好,让人误以为是整型变量
if(!p) if(p) //不好,让人误以为是bool变量
if(NULL ==p ) if(NULL != p) //好
5、switch
每个case不要忘记加break
switch case禁止使用return语句
case后面只能是整型、字符型、枚举类型。
6、在多层循环中,长的循环的放在内部,短的循环放在外部。
7、void关键字
【1】
任何类型的指针都可以赋值给void*,无需进行强制转换;反之不行
void* p1;
int* p2;
p1 = p2; //正确
p2 = p1; //错误——>修改成 p2 = (int*)p1;
【2】void不能代表一个真实的变量,因为定义变量时必须为其分配内存空间,定义void变量,编译器都不知道该分配多大的内存空间,所以void不能代表一个真实的变量。
void a; //编译错误
function(void a); //编译错误
【3】几个函数
void memset(void* buffer,int ch,size_t num);
例:
int array[100];
memset(array,0,100*sizeof(int)); //将数组array清0
8、return语句注意事项
return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动释放。
例如:
char* Fun()
{
char str[100];
... ...
return str; //在函数结束后,str会自动释放,导致未知的错误,程序崩溃
}
9、const修饰只读的变量必须在定义时进行初始化
const int aa; //编译失败,必须初始化
const int aa = 100;//编译成功
const与#define的区别
(1)const是在编译期间确定值,#define是在预处理阶段
(2)const有类型
(3)const在程序运行时只有一个备份,而#define在内存中有若干备份,因此const更加节省空间。
10、柔性数组
(1)结构体中的柔性数组成员前面必须至少有一个其他成员
struct st
{
int a;
char b;
char ch[]; //等价于char ch[0];
}
(2)柔性数组不属于sizeof(结构体)的一部分
11、enum枚举类型
enum 枚举类型名称
{
枚举常量1;
... ...
枚举常量n;
}枚举变量名;
枚举类型和#define的区别
(1)