1. float x 等于0: if((x<0.000001)&&(x>-0.000001))
- 一般float型只能精确到小数到后六位即1e-6,将float型的数x的绝对值abs(x)与1e-6比较,如果abs(x)比1e-6还要小的话就可以认为x的值为零,因为小数六位以后是不精确的,是没有意义的。
比如数0.0000001虽然确实不等于零,但是第七位小数1是没有意义的就可以认为这个数等于0。 - float,double分别遵循R32-24,R64-53的标准。所以float的精度误差在1e-6;double精度误差在1e-15 。所以要判断一个单精度浮点数是否为0:则是if( abs(f) < 1e-6);要判断一个双精度浮点数是否为0:则是if( abs(d) < 1e-15 );
2. 宏定义
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define DOUBLE(x) ((x)+(x))
3. 用printf函数显示调试信息
//#define __DEBUG_MSG
#ifdef __DEBUG_MSG
#define DEBUG_MSG printf
#else
#define DEBUG_MSG()
#endif
4. x%(2^n) = x-((x>>n)<<n)
5. 在C/C++里数组str作为参数时传递的实际上是指向数组第一个元素的指针。因此sizeof(str)返回的是指针的大小,即4。
- 以下形式的参数是完全等价的:
void Func(char str[100]); void Func(char str[]); void Func(char *str); void Func(char *(str+100));
6.指针p+n 指向(p的地址+n*sizeof(p的数据类型))
7.指针、数组与函数
int a ; 一个整形数
int *p; 一个指向整形数的指针
int **p; 一个指向指针的指针,它指向的指针指向一个整形数
int a[10]; 一个有10个整形数元素的数组
int *a[10]; 一个有十个指针元素的数组(指针数组),每个元素都指向一个整形数
int (*p)[10]; 一个指针(数组指针),指向一个有十个整形数元素的数组
int *f(int); 一个函数(指针函数),返回值是一个地址(指针)
int (*p)(int); 一个指针(函数指针),指向一个返回整形数值的函数
int (*a[10])(int); 一个有十个指针(函数指针)元素的数组,每个元素都指向一个函数
8. 绝对地址的操作
-
向绝对地址0x100000 写值
*(unsigned int*)0x100000 = 0x1234;
-
程序跳转到绝对地址0x100000去执行
void (*main)(void); main = (void*)0x100000; main(); or *((void *)0x100000) ();