我见过很多这类,但我不知道它是什么意思
unsigned char somevar[MAXLEN];
int *ptr = (int *) somevar;
有人可以解释一下吗?
答案 0 :(得分:3)
基本上你将一个字符数组解释为指向int的指针。假设sizeof (int)
为4且char数组包含这些字节:
b0 b1 b2 b3 b4 b5 b6 b7
现在ptr
会指向b0
,但会将其威胁为int
。也就是说,
ptr[0]
是由字节b0, b1, b2, and b3
组成的整数
ptr[1]
是由字节b4, b5, b6, and b7
HTH
答案 1 :(得分:1)
只是通过somevar
指针将int
解释为ptr
的序列(或仅一个)。只需递增ptr
一次,就会向前移动指针sizeof(int)
。
在进行类似转换时请注意字节顺序。来自somevar
的字节可能需要重新排序才能正确解释为整数。
还要确保somevar
的长度是sizeof(int)
的倍数,否则在尝试访问最后一个int
时会出现未定义的行为,因为它将部分可用。
答案 2 :(得分:0)
C中数组的标识符是指向数组第一个元素的指针。因此,在您的示例中,somevar是一个unsigned char *,指向在代码段第一行中声明的数组的第一个元素。
因此很明显ptr也是指向数组第一个元素的指针,但由于类型转换,它将其视为有符号整数。
这不一定是一个好的类型转换,很有可能整数和字符的大小完全不同,这可能导致一些不确定的行为。
答案 3 :(得分:0)
当您从二进制文件或网络套接字读取一些原始字节时,通常会这样做,并且您知道(根据数据格式或协议)这些字节序列表示整数。这将为您提供一个指针,您可以取消引用并获取由这些字节表示的整数值。
答案 4 :(得分:0)
在右侧,它是指向int的指针。
在左侧,它是一个未知类型的变量(somevar),被转换为指向int的指针。人们建议以批判的眼光看待某些人。有时需要用C铸造;但是,更常见的是在C语言中表示选择了somevar的错误类型,或者你正在做一些不太可能移植的东西。
在这种情况下,您将字符打包为整数。根据系统的不同,您可能会得到一个int,其内部位表示与[char0,char1,char2,char3]相匹配,后跟另一个int,其内部位表示与字符串4到7匹配。
但是,在某些其他系统上,您可能会使用内部位表示为[char3,char2,char1,char0]的int到达。最后,还有其他系统可以更加不同地处理位顺序。
如果你仔细挖掘代码,你会发现还有另一个地方,你的“构造”int的指针会被强制转换为char *。但是很有可能是好的。
答案 5 :(得分:0)
它是指向数组第一个值的指针。因为它是一个无符号字符,所以它需要被类型转换为int(它不需要是,但这是一个好习惯)。根据某人对大小的关注,大小int将在大多数情况下始终小于unsigned char。