C语言 - Codeing时常用的func

1.给指针指定地址

       a.

                int *data;       //int 类型变量
                data = (int *)0x80000000

        b.

                txxx *data;    //txxx结构体
                data = (txxx *)0x80000000;

2.宏定义判断大小

       a.

                 #define add(ptr) ptr = (ptr<MAX) ? ptr+1:0
                注意这里不需要指定类型,也不需要指针

        b.

                如果是多语句,需要用\分隔
                #define add(ptr)   \
                {                   \
                   ptr++;           \
                   if(ptr == MAX)   \
                      ptr = 0;      \
                }

3.COMPILE_ASSERT

        #define COMPILE_ASSERT(exp,str) extern char __ct_[(exp)?1:-1]
        使用场景:
        #define Parameter_Cnt 100
        COMPILE_ASSERT((Parameter_Cnt!=100),"Parameter Cnt Error")

        //在编译过程中编译器如果检查到Parameter_Cnt != 100(可能被后续的commit误修改),就会报错

4.结构体函数

        typedef struct XXX
        {
           int a;
           int b;
           int (*add)(int c,int d);
           int (*sub)(int c,int d);
        }txxx;

        int add(int a,int b)
        {
           xxx;
        }
        int sub(int a,int b)
        {
           xxx;
        }
        txxx test = {
           .a = 1;
           .b = 2;
           .add = add;
           .sub = sub;
        };

5.设置字节对齐

        ①根本原因在于CPU访问数据的效率问题
        ②对于32位机器来说,4B对齐能够提高CPU访问速度
        ③一个变量,跨越了4B边界存储,那么CPU要读两次,效率低下

        使用伪指令#program pack(n),C编译器将按照n个字节对齐
        使用伪指令#program pack(),取消自定义字节对齐方式
        __attribute(aligned(n)),让所作用的结构成员对齐在n字节自然边界上,如果有成员长度大于 n,则按照最大成员的长度来对齐
        __attribute(packed),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐
        #program pack(push)
        #program pack(4)
        struct xxx
        #program pack(pop)

f76e2d4adce444c39a771837ec8d1dee.png

6.平方函数

        #include <math.h>
        int a = pow(4,2);       //返回4的平方

7.次方函数

        data = pow(10,0);  //10的0次方
            int ret = 1;
            int a = data;
            int b = n;
            while(b)
            {
                if(b&1)
                {
                    ret *= a;
                }
                b >>= 1;
                a *= a;
            }

8.等差数列求和

        公差常用字母d表示,等差数列{an}的通项公式为:an = a1 + (n-1)d
        前n项和公式为:Sn = n*a1 + n(n-1)d/2
        或者 Sn = n(a1+an)/2

9.求两个数的平均值

        mid = (L+R)/2   //这种写法有缺陷,如果L+R比较大,会溢出
        mid = L + (R-L)/2

10.异或

        相同为0,不同为1
        可以理解为:无进位相加
        满足交换律和结合律:a^b = b^a,a^b^c = a^(b^c)
        n^0 = n, n^n = 0

        交换两个数的值
        a = a^b
        b = a^b
        a = a^b
        *a和b在内存中不能是一块位置,如果是一块位置,会把这块内存clear为0

11.memset

        按字节赋值
        void *memset(void *str, int c, size_t n)

12.malloc( )&calloc( )

        void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
        void *calloc(size_t nitems, size_t size) 分配所需的内存空间,并返回一个指向它的指针。        

        malloc 不会设置内存为零,而 calloc 会设置分配的内存为零,所以效率较低

13.逻辑取反&按位取反

        !a   //逻辑取反
        ~a   //按位取反

Other:

1.>> <<优先级

        ①左移、右移优先级是最低的,比+-还要低
        ②一般有>> <<符号时,最好外面加层( )

2.qsort()

cf42f51f5ba145dea001bb8f1cdf2a23.png

10df9c1927644980bc2b8fca59f14f50.png

【从小到大排序】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bigger_One

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值