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