[英]What's the difference between these two statements involving pointers arithmetic?
有什么區別
char cur_byte=*((char *)(buf+i));
和
char *b=(char *)(buf);
char cur_byte=*(b+i);
假設:buf是指向void // void * buf的指針; 我在for循環中用作迭代器我在交流源代碼中發現了這個代碼(第一行),它生成了rabin指紋,並且由於VC2010 express將其報告為錯誤,我必須將其替換為后兩行。 我不確定它是否可以達到預期的目的。 另外,如果有人能給我一個提示,在哪里可以獲得用於內容定義的分塊和指紋生成的C ++源代碼,我將不勝感激。
在你的第一個語句中,你將一個整數( i
是一個整數類型,對吧?)添加到void*
,然后再轉換為char*
。 使用void指針的指針算法不是由C標准定義的 ,因為編譯器無法知道它應該增加多少指針。 但是,有些編譯器定義sizeof(void) == 1
。 在這種情況下,您的兩個片段是等效的,這解釋了為什么這段代碼可能與另一個編譯器一起使用(感謝Steve Jessop指出這一點) 。
你在你的第一個片段中的含義可能是char cur_byte=*(((char *) buf) + i);
,由位於地址所指向的字符i
BUF后面的字符。
在以下模式中,其中i==4
, cur_byte
將被賦值為r
。
Memory: |a| |w|o|r|d
^ ^
buf buf+i
在你的第二個聲明中:
char *b=(char *)(buf);
char cur_byte=*(b+i);
首先將buf
分配給b
,然后將b + i
的內容分配給cur_byte
。 b
有char*
類型,所以添加i
將在b
之后給出i
字符的地址。
Memory: |a| |w|o|r|d|
^ ^
buf
b b+i
最后這兩個陳述是等價的(除了b
的賦值)。
區別在於表達式(buf + i)
與(b + i)
。
b
的類型為char*
因此(b + i)
將指向b + sizeof(char) * i
。
buf
可以是不同類型,因此(buf + i)
將指向buf + sizeof(BUFS_TYPE) * i
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.