C++ 使用指针访问结构的各个字节

C++ 使用指针访问结构的各个字节,c++,pointers,struct,C++,Pointers,Struct,我有一个应用程序,需要在结构上执行CRC操作。我决定实现这一点的最佳方法是简单地遍历构成结构的所有单个字节,并将它们添加到CRC例程中。strict名为Config,类型为ConfigT。下面的代码大致描述了我想要做的事情,我只需要了解使用指针算法访问结构字节的语法 uint16_t CalculateEepromChecksum() { uint16_t crc = 0; uint8_t *ptr = &Config; for (uint32_t i = 0; i

我有一个应用程序,需要在结构上执行CRC操作。我决定实现这一点的最佳方法是简单地遍历构成结构的所有单个字节,并将它们添加到CRC例程中。strict名为Config,类型为ConfigT。下面的代码大致描述了我想要做的事情,我只需要了解使用指针算法访问结构字节的语法

 uint16_t CalculateEepromChecksum()
 {
  uint16_t crc = 0;
  uint8_t *ptr = &Config;

   for (uint32_t i = 0; i < sizeof(ConfigT); i++)
   {
            crc = _crc16_update(crc, ptr[i]);
   }

    return crc;
  }
…在以下行:

 uint8_t *ptr = &Config;

您需要将
crc
的地址传递给
\u crc16\u update
,以便对其进行修改。如果不这样做,并且这不是编译错误,那么最多可以预期未定义的行为

_crc16_update(&crc, *(ptr+i));
此外,您还可以在
struct
字节数组上使用数组表示法,而不是指针表示法。两种形式的工作原理相同,但是,第一种形式可能更好地表明您使用的是字节数组:

  _crc16_update(&crc, ptr[i]);

不能将不同的指针类型分配给彼此,因为它们不兼容。如果需要,必须显式地将其强制转换为其他类型

uint8_t *ptr = (uint8_t *)&Config;

或者更好,将_crc16_update声明为
_crc16_update(uint16_t*crc,void*data,int length)并在函数内部循环,而不是为每个字节调用它

啊,好眼力。假设它是crc=\U crc16\U update()。这是我的错误part@chris12892现在有道理了。我更新了原始问题以修复crc uint16问题。使用数组表示法失败,编译器错误6“Config[i]”中的“operator[]”不匹配@chris12892应该是
ptr[i]
。不能像数组一样访问
结构,除非像以前一样将其强制转换为固定宽度的类型。你没有足够仔细地阅读我写的内容<代码>uint8_t*ptr=(uint8_t*)和配置
Config
的地址正在被类型转换为
uint8\u t
指针(
uint8\u t*
)。注意
*
。你是1837年出生的同一个Lưu Vĩnh Phúc吗@FiddlingBits不确定他是否是我的祖先,但我不认为他只是想开个玩笑。。。但是我把英语弄糟了。英雄联盟
uint8_t *ptr = (uint8_t *)&Config;