我见过很多这样的类型,但我不知道它的含义是什么。
unsigned char somevar[MAXLEN];
int *ptr = (int *) somevar;
有人能解释一下吗?
基本上,您将字符数组解释为指向int的指针。假设sizeof (int)
为4,而字符数组包含这些字节:
b0 b1 b2 b3 b4 b5 b6 b7
ptr
将指向b0
,但将其视为int
。也就是说,
ptr[0]
是由字节b0、b1、b2和b3
组成的整数
ptr[1]
是由字节b4、b5、b6和b7
组成的整数
仅仅是somevar
会通过ptr
指针被解释为一个int
序列(或只有一个)。将ptr
增加一次就可以将指针移动sizeof(int)
个字节。
在执行这样的转换时要注意字节序。从somevar
中提取的字节可能需要重新排序才能正确地被解释为整数。
还要确保somevar
的长度是sizeof(int)
的倍数,否则当尝试访问最后一个int
时,由于它只部分可用,您将会得到未定义的行为。
当你从二进制文件或网络套接字读取一些原始字节时,你可以知道(从数据格式或协议)这些字节序列表示一个整数,通常会这样做。这将给你一个指针,你可以取消引用并获取由这些字节表示的整数值。
右边是一个指向int的指针。
左边是一个未知类型的变量(somevar),被强制转换为指向int的指针。建议您以批判的眼光看待somevar。有时候在C中需要进行强制转换;但更多时候,在C中进行强制转换表明选择了错误的somevar类型,或者正在做一些不太可能可移植的事情。
在这种情况下,您正在将字符打包到int中。根据系统的不同,您可能会得到一个内部位表示与[char0,char1,char2,char3]匹配的int,后跟另一个内部位表示与字符四到七匹配的int。
然而,在其他一些系统上,您可能会得到一个内部位表示为[char3,char2,char1,char0]的int。最后,还有其他处理位顺序更加不同的系统。
如果您深入研究代码,很有可能会发现另一个地方将指向您“构造”的int的指针转换回char*。
它是指向数组第一个值的指针。由于它是无符号字符,需要将其强制转换为int类型(虽然不需要,但这是良好的实践)。就大小而言,int类型的大小大多数情况下都比无符号字符小。
char *
的任意指针不一定满足int
的对齐要求,可能无法被准确地存储在int *
中(int *
可能比char *
少一些位)。即使int *
可以存储该值,如果未满足对齐要求,则在尝试取消引用指针时行为是未定义的。最后,还有别名考虑因素,这些因素大多可以通过其中一个涉及到char
类型来缓解。 - R.. GitHub STOP HELPING ICEnew char[]
动态分配的数组才能保证这样。栈或成员变量没有任何此类保证。这就是为什么C++0x中有一个std::aligned_storage<T>
的原因。 - Puppy