• 一些小细节


    1、C中printf计算参数时是从右到左压栈的。

    定义一个数组 int arr[ ] = {6 , 7, 8 , 9, 10}

    再定义一个指针 sint  *prt = arr;

    printf("%d ",*ptr); 此时ptr指向第一个元素6;

    *(ptr++)+ = 123展开为*ptr = *ptr + 123; ptr++; 此时ptr指向第二个元素7;

    printf(“%d,%d ”,*ptr,*(++ptr)); 从右到左运算,第一个是(++ptr),也就是ptr++,*ptr = 8,此时ptr指向第三个元素8,所以输出全为8.

    2、编程风格

      if('A' = a)

      {

        a++;

      }

      if(a == 'A')

      {

        a++;

      }

      第一种写法更好一些。如果把“==”误写做“=”,因为编译器不允许对常量赋值,就可以检查到错误

    3、

    %08x为整型以16进制方式输出的格式字符串,会把后续对应参数的整型数字,以16进制输出。08的含义为,输出的16进制值占8位,不足部分左侧补0。

     4、类型转换

    设 unsigned int a = 0xFFFFFFF7;

      对于语句char* b = (char*)&a中a本身为一个uint类型的值,把它的地址赋给一个执行char类型数据的指针。char类型的长度只有一个字节,打印char类型的指针指向的值会是多少?

      &a的结果是一个指针,它的类型取决于a的类型,此处&a的类型应该是:

      unsigned int *;

      char *b = (char *)&a;

      上面等价于:

      unsigned int *p = &a;     //p中的内容是a的地址,即p指向a

      char *b = (char *)p;  //此处的强制转换只是使b也指向a而已

      上面的步骤就是将一个unsigned int 类型的指针强制转换成一个char型的指针。

      所以请注意:这里是char类型的指针转换,而不是char类型的转换。

      这样转换后,假设a的地址是x:

      p + 1 = x + 1*sizeof(int) = x + 1* 4 = x + 4;

      b + 1 =x + 1*sizeof(char) = x + 1*1 = x+1;

      因此将一个unsigned int 类型的指针强制转换成一个char型的指针影响的只是指针的寻址,一开始都是指向a地址的开头。

      所以printf("%08x",*b);  得到的是FFFFFFF7

  • 相关阅读:
    selector 使用说明
    volley用法之 以post方式发送 json 参数
    linux系统下使用流行的版本管理工具 Git
    Android BLE 蓝牙编程(四)
    Android BLE 蓝牙编程(三)
    Android BLE 蓝牙编程(二)
    Android BLE 蓝牙编程(一)
    php比较两个字符串是否相同
    下拉刷新
    理财小工具(二)贷款计算器
  • 原文地址:https://www.cnblogs.com/mingyunrangwozoudaoxianzai/p/7136350.html
Copyright © 2020-2023  润新知