在C中使用'*'作为'value at'运算符

时间:2013-06-05 10:53:19

标签: c operators variable-assignment

这里我有一个问题,就是从我用来通过UART接收一些数据的缓冲区为结构成员赋值。

我使用的缓冲区是一个char数组/缓冲区,名为buff,大小为35字节,是一个全局缓冲区。 缓冲区中的第8个字节称为left_low,它是一个4字节的值。 现在,到目前为止我已经理解了C,运算符'*'是'Value At'运算符。 为了从缓冲区的第8个字节开始复制4个字节,以下是我编写的代码。 它是否正确?或者我需要在这里使用memcpy()吗?我不知道memcpy()在这种情况下是如何工作的。请帮助!

char buff[35];
int write_function()  
{  
  struct calibration_data dcs2_config;  
  dcs2_config.left_low = *(buff+1*8); //will this work?  
  //or should this be done?  memcpy(&dcs2_config.left_low,buff+1*8,4);  

  return 0;  
}  

3 个答案:

答案 0 :(得分:1)

不,它不会起作用。

buff+1*8的类型为char*,因此*(buff+1*8)的类型为char。因此,dcs2_config.left_low = *(buff+1*8);会将buff+1*8处的单字符值写入4字符left_low(进行整数提升)。

您最好的选择可能不是memcpy,而是投射指针。假设left_lowint

dcs2_config.left_low = *((int *)(buff + 1*8));

答案 1 :(得分:0)

您的代码只会复制一个char(一个字节),因为buff是一个char数组。 memcpy将按预期工作。

我不知道为什么你写1 * 8,当你可以写8,或sizeof(char)* 8(但请记住sizeof(char)总是1)。

答案 2 :(得分:0)

你应该使用memcpy。你试图复制的方式只会选择一个字节(字符长度)。