所以,在我的程序中,我有一个变量
uint32_t buffer[16];
但是,有时我需要将其视为
uint8_t char_buffer[64];
最明显的解决方案是工会。但是,出于求知欲,是否有另一种方法可以告诉编译器我想将数组视为某种任意类型的数组?类似的东西
((uint8_t *)buffer)[i]
?
所以,在我的程序中,我有一个变量
uint32_t buffer[16];
但是,有时我需要将其视为
uint8_t char_buffer[64];
最明显的解决方案是工会。但是,出于求知欲,是否有另一种方法可以告诉编译器我想将数组视为某种任意类型的数组?类似的东西
((uint8_t *)buffer)[i]
?
铸造方法是完美的。它将使编译器将数组视为整数数组。在您的特殊情况下,使用
((uint32_t *)buffer)[index];
然而,正如@JerryCoffin 指出的那样,存在对齐问题。如果您将数组静态分配为 a char []
,则它不一定是 4 字节对齐的(整数需要这样)。如果您确实想避免这个问题,请使用它,malloc()
因为它可以保证适当的 alginment。
ISO C99 标准说:
当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。
这表示如果uint8_t
是typedef unsigned char
(并且它必须是如果uint8_t
存在于您的系统中),那么您的代码必须工作:数组引用相当于取消引用的指针 + int 加法。
请注意,这仅在转换为 char
. 以其他方式或其他方式转换只能保证在您最终可以转换回来的意义上起作用,并且最终将等于原始值。例如,您不能从 32 位长数组转换为 16 位短数组并确保符合标准的任何内容,尽管它可能在大多数 CPU/编译器组合的实践中工作。