算术的铸造指针 - C

时间:2012-02-19 18:51:18

标签: c pointers

如果我有一个void * x,但是我想把它转换为char *,那么++运算符会使它指向下一个字节,而不是下一个4字节块。

然而,当我这样做时:

(char *) x -= byte_length;

编译器抱怨:

Error, lvalue required as left value of assignment.

我哪里出错了? 感谢。

5 个答案:

答案 0 :(得分:5)

我会这样做:

 x = (char*)x - byte_length;

x投射到char*,然后应用偏移,然后分配回x。由于void*与所有指针类型的赋值兼容,因此无需进一步转换。

答案 1 :(得分:5)

(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

答案 2 :(得分:2)

做这样的事情:

void* x;
char* cx = (char*)x;
cx -= byte_length;
x = cx;

答案 3 :(得分:1)

(char*) x -= byte_length;

在此声明中,(char*) x创建了一个临时值,其中char*为类型。您只能根据编译器分配变量,或者更准确地说, references (或lvalue)。

获取引用的一种方法是将地址x 转换为char*并解除引用:

*(char*) &x -= byte_length;

答案 4 :(得分:0)

(char*)x是一个临时值,无法在内存中寻址。您无法对--进行int i,原因与(i+5)++相同,您无法x=(char*)x-byte_length;

您应该改为{{1}}。

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