簡體   English   中英

這兩個涉及指針算術的語句有什么區別?

[英]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==4cur_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 bchar*類型,所以添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM