C 语言实用技巧

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)<

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) ();
    

你可能感兴趣的:(C 语言实用技巧)