一、C语言易错点
1.多种混合类型数据的混合运算
多种数值型数据在进行混合运算时,系统会自动进行数值类型的转换,可能导致数值误差和溢出(尤其是float和double型)
2.指针
①定义一个指针变量但没有初始化,野指针
野指针随机指向某个内存地址,指针所指内存直接赋值操作,将该单元中原有的数据覆盖,使该数据丢失;若指向系统的数据区中,会导致系统运行的异常甚至死机
②动态分配malloc(size)在堆上分配size个字节的连续空间,调用结束后返回一个指向分配好的储存空间的指针,编程时必须在使用完该储存空间后调用对应的函数free( )来释放掉
③栈溢出
局部变量指针出现使用错误,会发生栈溢出
④堆溢出
⑤void的用法
void malloc(size)表示函数的返回值可以转换成任何类型的地址值(如 char *,int * 等) void不能用来定义数值变量,可以定义指针变量(可以将任何数据类型的地址赋给指针变量)
⑥数组和指针变量在使用过程中的不同
指针可以通过加减数值来移动它所指的位置(p++正确,char k[20];k++;错误)
⑦指针移动时挪动的位移与指针所定义的类型相关,指针变量在使用时要与定义的类型相一致
char c[10]; int * d; d=c; ×
⑧int(*a)[10] 指向十个整形数组的指针变量 int * a[10]指向10个整型数组的指针元素
⑨指针变量作为函数的形参时,实参传递过来的应是对应变量的地址,而不是变量名
3.多重运算
①在大多数C编译系统中,系统对参数的求值顺序是自右向左
②避免引起二义性的写法
4.字符串长度计算
sizeof( )查看一个实体在储存中所占的字节数,包含字符串的结束符\0 struct b{.......}可用sizeof(b)查看一个结构体b所占的字节数
计算一个字符串的长度是不包括结束符的 用strlen( )
字符串操作以str开头的库函数用strlen( )
二、程序优化
1.register的使用
register变量运行时不占用内存空间,而是放在CPU中寄存器中运算,故速度快 程序中循环的局部变量可以定义为register变量使用,但CPU中寄存器数量有限,函数中不能使用太多的寄存器变量
2.循环体内的优化
①可多采用宏定义(#define)
②在多重循环中,最长的在最内层
3.指针代替数组下标
4.库函数的使用
效率低的库函数可以用自己编写的函数代替
5.符合赋值运算
6.位操作
7.数学方法优化