繁体   English   中英

算术的铸造指针 - C

[英]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;

xchar* ,然后应用偏移量,然后分配回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; 代替。

另见http://c-faq.com/ptrs/castincr.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM