C 什么是(uint32_t*)?

C 什么是(uint32_t*)?,c,C,我是C的新手。 我不明白如何解决下面代码的最后两行,你能解释一下吗? 多谢各位 pBuffcmd=uint32_t*&CmdBuffer[CmdBuffer_Index]; *pBuffcmd=cmd uint32_t*是演员阵容。强制转换是执行转换的运算符 在此代码中,&CmdBuffer[CmdBuffer\u Index]是指向CmdBuffer中特定元素的指针,该指针的类型为“指向uint8\u t的指针”,也写为uint8\u t*。此强制转换将其转换为指向uint32_t的指针,该指

我是C的新手。 我不明白如何解决下面代码的最后两行,你能解释一下吗? 多谢各位

pBuffcmd=uint32_t*&CmdBuffer[CmdBuffer_Index]; *pBuffcmd=cmd

uint32_t*是演员阵容。强制转换是执行转换的运算符

在此代码中,&CmdBuffer[CmdBuffer\u Index]是指向CmdBuffer中特定元素的指针,该指针的类型为“指向uint8\u t的指针”,也写为uint8\u t*。此强制转换将其转换为指向uint32_t的指针,该指针也被写入uint32_t*

然后*pBuffcmd=cmd;尝试将值cmd写入转换指针指向的uint32_t

这是错误的代码。C标准不保证将uint8_t*转换为uint32_t*会起作用。即使这样做有效,C标准也不能保证使用uint32\u t引用写入使用元素类型uint8\u t定义的数组中的字节会起作用。该代码可能是为特定的C实现而设计的,在该实现中,该代码将起作用,但可以使用标准C代码获得所需的结果:

memcpy(&CmdBuffer[CmdBuffer_Index], &cmd, sizeof cmd);
uint32_t*是演员阵容。强制转换是执行转换的运算符

在此代码中,&CmdBuffer[CmdBuffer\u Index]是指向CmdBuffer中特定元素的指针,该指针的类型为“指向uint8\u t的指针”,也写为uint8\u t*。此强制转换将其转换为指向uint32_t的指针,该指针也被写入uint32_t*

然后*pBuffcmd=cmd;尝试将值cmd写入转换指针指向的uint32_t

这是错误的代码。C标准不保证将uint8_t*转换为uint32_t*会起作用。即使这样做有效,C标准也不能保证使用uint32\u t引用写入使用元素类型uint8\u t定义的数组中的字节会起作用。该代码可能是为特定的C实现而设计的,在该实现中,该代码将起作用,但可以使用标准C代码获得所需的结果:

memcpy(&CmdBuffer[CmdBuffer_Index], &cmd, sizeof cmd);

在pBuffcmd=uint32_t*。。。是对右侧内容的强制转换,指向uint32_t的指针,uint32_t是大小为32位的无符号整数,在pBuffcmd=uint32_t*…中定义。。。右边是一个指向uint32_t的指针的类型,uint32_t是一个大小为32位的无符号整数,用Color me定义。我真的很困惑,为什么不能将一个八位字节向量视为一个四个八位字节的双字向量?C标准如何保证或不能保证这一点?数组是一个连续填充的内存区域,没有任何结构或封装,只有一个八位字节序列,没有填充,没有其他内容-您是否暗示可能存在地址对齐问题?@amn-除了少数例外,C标准不保证指向不同类型的指针具有相同的表示或对齐要求,并且将指针值转换为不同类型可能不会保留原始指针值。实际上,任何提供uint8_t和uint32_t的实现都很可能按预期执行此代码,但这并不能保证。@amn:C 2018 6.3.2.3 7“指向对象类型的指针可能会转换为指向其他对象类型的指针。如果生成的指针未与引用类型正确对齐,则行为未定义…”由于CmdBuffer是uint8_t的数组,编译器可能会将其定位到任何位置,而无需特定对齐,因此地址和CmdBuffer[CmdBuffer_Index]可以类似地位于任何位置。但是uint32_t通常有四个字节的对齐要求,在这种情况下,到uint32_t*的转换行为可能不是由C标准定义的。@JohnBode在实践中,任何提供uint8_t和uint32_t的实现很可能只在非常慷慨的i最有可能的解释是:即使x86也不能完全避免对齐问题:@amn:关于指针转换的规则是适应具有不寻常内存空间和不同类型指针的不同表示形式的C实现。在现代C实现中,您不太可能遇到它的问题,但le仍然存在。我真的很困惑,为什么不能将一个八位字节向量视为一个四个八位字节的双字向量?C标准如何保证或不能保证这一点?数组是一个连续填充的内存区域,没有结构或填充,只有一个八位字节序列,没有填充,没有其他内容-您是否暗示可能存在地址对齐问题?@amn-除了少数例外,C标准不保证指向不同类型的指针具有相同的表示或对齐要求,并且将指针值转换为不同类型可能不会保留原始指针值。实际上,任何实现这提供了uint8\u t和uint32\u t,它们很可能会按预期执行此代码,但不能保证。@amn:C 2018 6。
3.2.3 7表示“指向对象类型的指针可能会转换为指向其他对象类型的指针。如果生成的指针与引用的类型没有正确对齐,则行为未定义…”由于CmdBuffer是uint8_t的数组,编译器可能会将其定位到任何位置,而没有特定对齐,因此地址和CmdBuffer[CmdBuffer\u索引]可以类似地位于任何位置。但是uint32_t通常有四个字节的对齐要求,在这种情况下,到uint32_t*的转换行为可能不是由C标准定义的。@JohnBode在实践中,任何提供uint8_t和uint32_t的实现很可能只在非常慷慨的i最有可能的解释是:即使x86也不能完全避免对齐问题:@amn:关于指针转换的规则是适应具有不寻常内存空间和不同类型指针的不同表示形式的C实现。在现代C实现中,您不太可能遇到它的问题,但李先生留下来了。