[英]Casting pointers for arithmetic - C
如果我有一个void * x,但是我想将它转换为char *,那么++运算符将指向下一个字节而不是下一个4字节块。
但是,当我这样做时:
(char *) x -= byte_length;
编译器抱怨:
Error, lvalue required as left value of assignment.
我哪里出错了? 谢谢。
我会这样做:
x = (char*)x - byte_length;
将x
为char*
,然后应用偏移量,然后分配回x
。 由于void*
与所有指针类型兼容,因此不需要进一步转换。
(char *)x
计算为临时值,其值与x
相同,但类型不同。 编译器不允许-=
临时。 做
x = (char *)x - byte_length;
情况类似于以下情况:
short x = 0;
(long)x += 1; // invalid; (long)x is a temporary
x = (long)x + 1; // works
做这样的事情:
void* x;
char* cx = (char*)x;
cx -= byte_length;
x = cx;
(char*) x -= byte_length;
在此语句中, (char*) x
创建一个临时值,其中char*
为type。 您只能分配给变量,或者更确切地说,分配引用 (或根据编译器的lvalue
)。
获取引用的一种方法是将x的地址转换为char*
并解除引用:
*(char*) &x -= byte_length;
(char*)x
是一个临时值,它没有在内存中寻址。 你不能做--
对它,因为如果你有int i
,你不能做(i+5)++
。
你应该做x=(char*)x-byte_length;
代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.