杂记3

0. const受保护权限

  请看下面的代码片

  int num = 0;

  const int *p = #

  这一段代码在C语言中是可以通过的,因为num在定义的时候没有修饰,所以权限很大,当用*p指向它的时候可以对它进行修改。

  再看下面的代码片:

  const int num = 0;

  int *p = #

  这段代码在C编译器中会报错,原因是,定义num的时候被const修饰,那么这个num就是受保护的,即是num不能随便改变,所以当用*p指向它的时候会报错。

1. printf的返回值

 C语言中printf的返回值是打印在屏幕上的字符的个数。

2. 计算一个数二进制位中1的个数

  这里我们提供第二种方法就是,我们可以使这个数先&1,如果结果是是1,则count++,然后把这个数右移一位,再次&1,这些操作放在一个循环里面,循环32,但是这样做循环了32,如果我只是后几位有1,前面都是0呢,显然这样做的话还不是最优的结果

  下面我们提供第三种方式,int n = 11;n = n&(n-1);这里n&(n-1)实际的操作结果就把原本的n的二进制中的最后一个1消掉了,这就是突破点。我们可以利用这个特点,做一个循环while(n != 0){count++;n=n&(n-1)};这个时候计算的count就是n中1的个数。

3. 数值和0的比较

  整型和0的比较:if(0 == a)

   指针和0的比较:if(NULL == p)

   浮点型和0比较:if(a>-0.000000000000001&&a<0.00000000000000001)

4. 数组名

  int arr[10];

  1.   int sz = sizeof(arr);

  2.   &arr;

只有上面的这两种数组名的使用方式时,arr代表的是整个数组,其余的方式均表示数组首元素的地址。

如:sizeof(arr + 1);它表示的就是数组下标为1的元素。

5. 用联合体测试大小端

请看下面的代码片
    union tag{
        int a;
        char c;
    }tag;
    tag.a = 1;
    printf("%c",tag.c);    //因为在联合体中,a和c使用共同的存储空间,且他们的起始位置一致,所以当给赋值1之后,
                           //如果是小端存储则这个1被放在了高地址,即他们的共同内存中的后面的位置,
                           //这样使用%c打印的时候,是从开始的地方算起,所以就得到一个未知的量

6.memset的使用

  memset(地址,0,sizeof(...))

  地址传入的是一个地址,然后那个0是你要初始化的内容,最后的是长度习惯用sizeof进行求解,这里的长度是以字节为单位的

7.malloc申请空间后判断

pmail->maillist = (PeoInfo*)malloc(sizeof(PeoInfo)*ALLMAX);
    if (NULL == pmail->maillist)
    {
        perror("malloc失败");
        return;
    }

8. 链表操作

 链表中有一些内容不好操作时,比如删除屋头节点的非尾节点,或者在链表前面插入一个元素,想着用赋值操作

9.pmail->maillist = realloc((pmail->maillist), sizeof(PeoInfo)*((pmail->MAX) + 3));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值