一些小细节

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

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

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

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

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

printf(“%d,%d\n”,*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

posted @ 2017-07-08 12:04  半夏生  阅读(142)  评论(0编辑  收藏  举报