美文网首页
C 语言实用技巧

C 语言实用技巧

作者: jingr1 | 来源:发表于2017-10-04 20:25 被阅读0次

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

    相关文章

      网友评论

          本文标题:C 语言实用技巧

          本文链接:https://www.haomeiwen.com/subject/nnmtsxtx.html