我可以将unsigned char *转换为unsigned int *吗?

时间:2014-03-31 19:18:20

标签: c++ memory-management static-cast

error: invalid static_cast from type ‘unsigned char*’ to type ‘uint32_t* {aka unsigned int*}’
     uint32_t *starti = static_cast<uint32_t*>(&memory[164]);

我已经分配了一个字符数组,我想读取4个字节作为32位int,但是我得到了一个编译器错误。 我知道我可以转移,像这样:

(start[0] << 24) + (start[1] << 16) + (start[2] << 8) + start[3];

它会做同样的事情,但这是一项额外的工作。

是否有可能以某种方式将这四个字节转换为int?

4 个答案:

答案 0 :(得分:8)

static_cast旨在用于&#34;表现良好的&#34;演员表,例如double -> int。 您必须使用reinterpret_cast

uint32_t *starti = reinterpret_cast<uint32_t*>(&memory[164]);

或者,如果你愿意,C风格的演员阵容:

uint32_t *starti = (uint32_t*)&memory[164];

答案 1 :(得分:6)

是的,你可以unsigned char*指针值转换为uint32_t*(使用C风格的演员或reinterpret_cast) - 但这并不是#39; t表示你必须使用结果。

此类转换的结果可能不会指向正确对齐以容纳uint32_t对象的地址。例如,unsigned char*可能指向奇数地址;如果uint32_t需要对齐,那么当您尝试取消引用结果时,您将会有未定义的行为。

如果您可以保证unsigned char* 指向正确对齐的地址,那么您应该没问题。

答案 2 :(得分:0)

我已经习惯了BDS2006 C ++,但无论如何这应该适用于其他编译器

char memory[164];
int *p0,*p1,*p2;
p0=((int*)((void*)(memory)));    // p0 starts from start
p1=((int*)((void*)(memory+64))); // p1 starts from 64th char
p2=((int*)((void*)(&memory[64]))); // p2 starts from 64th char

答案 3 :(得分:0)

您可以按照faranwath的建议使用reinterpret_cast,但请了解走这条路的风险。

在一个小端系统和一个大端系统中,你所得到的价值将完全不同。您的方法适用于这两种情况。