在数组中转换 void 类型指针

cast void type pointer in an array

假设我有一个 Uint 数组:Uint myarray[10]Uint 是无符号的 16 位整数。 我还定义了一个 void 类型的指针,这样

void * arrayHandle = &myarray;

添加一些偏移量,使 arrayHandle 指向 myarray[3](在此处标记,将在另一次测试中更改偏移量)

arrayHandle = (Uint *)arrayHandle + 3;

然后分配一个32位的float型数据到arrayHandle指向

的内存中
*((float *)arrayHandle) = 1234.5678;

32位的1234.5678可以表示为两个16位的Uint原始数据,其中十进制高16位为21035,十进制低16位为17562。

毕竟我去查数组发现myarray[2] = 21035myarray[3] = 17562.

但是,当我返回更改偏移量时 arrayHandle 指向 myarray[2]

arrayHandle = (Uint *)arrayHandle + 2;

并进行类似的浮点数赋值。我发现 myarray[2] = 21035myarray[3] = 17562.

数组内容一模一样!谁能告诉我为什么?

数组已经是指针,尝试使用void * arrayHandle = myarray;

Then assign a 32 bit float type data to memory where arrayHandle points to

*((float *)arrayHandle) = 1234.5678;

到此为止,您实际上违反了严格的别名规则,从而产生了一个 UB(所以任何事情都有可能发生)。即使 arrayHandlevoid * 类型,它也源自 myarray,即声明为无符号整数类型。

对整数和浮点类型之间的 type punning 使用联合数组。