原创 指针的错误思考

2010-8-19 10:39 1460 3 3 分类: 工程师职场

当时,发送一串字符串:stu[]="vincent uart test";


原来的发送字符串的子函数为:


void UART0_Send_1Byte(INT8U Byte)
{
    while (!(IFG2&UCA0TXIFG));   // USCI_A0 TX buffer ready?
    UCA0TXBUF=Byte;
    while (!(IFG2&UCA0TXIFG));   // USCI_A0 TX buffer ready?
  //  while(!UCA0TXIFG);        vincent uart test    //等待发送完   
}
void UART0_Send_NByte(INT8U *ptr)
{
   INT8U i,l=0;
   while(*ptr++!= '\0') {l++;}    //计算发送数据的长度
   for(i=0;i<l;i++)
   {
      UART0_Send_1Byte(ptr);
   }  
}


串口调试助手:接收时一串乱码


程序改进后:


void UART0_Send_1Byte(INT8U Byte)
{
    while (!(IFG2&UCA0TXIFG));   // USCI_A0 TX buffer ready?
    UCA0TXBUF=Byte;
    while (!(IFG2&UCA0TXIFG));   // USCI_A0 TX buffer ready?
  //  while(!UCA0TXIFG);        vincent uart test    //等待发送完   
}
void UART0_Send_NByte(INT8U *ptr)
{
   INT8U i,l=0;
   while(*(ptr+l)!= '\0') {l++;}    //计算发送数据的长度
   for(i=0;i<l;i++)
   {
      UART0_Send_1Byte(ptr);
   }  
}


可以看到两个函数的区别就是在指针的应用上面:


1。   while(*ptr++ != '\0') {l++;}    //计算发送数据的长度


2。 while(*(ptr+l)!= '\0') {l++;}    //计算发送数据的长度


在第一种情况下:指针不断指向下一个字符,所以当程序执行  


for(i=0;i<l;i++)
   {
      UART0_Send_1Byte(ptr);
   }  


指针的首地址已经不是原来字符串的首地址了。。。


在第二种情况下:意思只是取出指针第l个字符的数值,并没有改变指针的指向位置。


所以ptr依然正确指向我们指定的数组....


关于上述用法只限于字符串的发送,才有效,如果传递的数组,上述方式就不可以了,例如:


发送一串数据str[]={0xaa,0x00 ,0x00,0x01,0x02,0x03,0x04 ,055}


将str[]数组传递给函数:


void UART0_Send_NByte(INT8U *ptr)
{
   INT8U i,l=0;
   while(*(ptr+l)!= '\0') {l++;}    //计算发送数据的长度
   for(i=0;i<l;i++)
   {
      UART0_Send_1Byte(ptr);
   }  
}


会发现,打印的数据只有第一个数据,因为‘\0’的数据就是0x00,所以传递数组数据时,不可用上面的函数,函数可以改为


void UART0_Send_NByte(INT8U *ptr,INT8U lenth)


{


INT8U i;
     for(i=0;i<lenth;i++)
     {
         UART0_Send_1Byte(ptr);
     }


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条