新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 《C与指针》读书笔记六

《C与指针》读书笔记六

作者:时间:2016-08-15来源:网络收藏

  在以前也使用过的运算,但是在这本书里作者详细的介绍了的“算数运算”、“关系运算”。的算数运算一般是 指针±整数。实现起来非常简单,我有位同事在R校验时也使用了。我们可以摘录一段。

本文引用地址:http://www.eepw.com.cn/article/201608/295500.htm

  U16 RC;

  U8 CRCH, CRCL;

  U8 *pUNChar;

  CRC = out_crc(UART0.RX_buf,UART0.RX_count-2);

  pUNChar = &CRC;

  CRCH = *(pUNChar++);

  CRCL = *pUNChar;

  此段代码在单片机上运行,所以U16是16位无符号整型数据,也就是unsigned int CRC。U8是一个无符号char型数据。 CRC 接收了out_crc( )函数的返回。也就是一组数的crc计算结果。需要将CRC拆分为两个8位数据。我们使用一个pUNChar指针指向该整型数据。在单片机中整型高8位存储在地址,低8位存储在高地址。

  CRCH = *(pUNChar++); 该条语句实现两个功能。第一将pUNChar指向地址的值赋给CRCH。也就是*(pUNChar)赋给CRCH, 其实就是CRC的高8位赋给CRCH。第二pUNChar自增。也就是pUNChar++。 其实等价于以下两条语句:

  CRCH = *pUNChar;

  pUNChar++;

  pUNChar++其实就是将pUNChar的值加1。也就是pUNChar指向CRC低8位。

  CRCL = *pUNChar;就非常好理解了。将pUNChar地址的值赋给CRCL。简单快速的实现了一个整型数据的拆分。其中用到了指针的加法运算。pUNChar是U8类型,所以pUNChar++是pUNChar值增加1。

  加入指针的类型是U16,加法运算会怎样。这个问题可以实验获得。

  U16 arrary[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ;

  U16 *pU16;

  pU16 = arrary;

  pU16++;

  pU16 = arrary;是将pU16指向arrary首个成员地址,即arrary[0]的地址。

  pU16++是将pU16指向arrary第二个成员地址,即arrary[1]的地址。arrary[1]与arrary[0]地址相差2。因为arrary是U16,2个字节。所以地址相差为2. pU16++也就使pU16的值增大了2。所以指针的算数运算的结果与本身的类型有关。指针关系运算其实可以不使用的。比如书中的例子:

  #define N_VALUES 5

  float values[N_VALUES]

  float *vp;

  for( vp =&values[0]; vap < &values[N_VALUES];)

  *vap++ = 0;

  初始化了一个values数组,并且全部初始化为0。如果按照一般的写法应该为

  char i;

  for( i =0; i

  values[ i ] = 0.0;

  再见到作者的实现方法之前,我一直是用这种方法。现在觉得作者的方法比较简单。



关键词: C 指针

评论


相关推荐

技术专区

关闭