簡體   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