这两个涉及指针算术的语句有什么区别?

Joh*_*ohn 3 c pointers void

有什么区别

 char cur_byte=*((char *)(buf+i));
Run Code Online (Sandbox Code Playgroud)

char *b=(char *)(buf);
char cur_byte=*(b+i);
Run Code Online (Sandbox Code Playgroud)

假设:buf是指向void // void*buf的指针; 我在for循环中用作迭代器我在交流源代码中发现了这个代码(第一行),它生成了rabin指纹,并且由于VC2010 express将其报告为错误,我必须将其替换为后两行.我不确定它是否可以达到预期的目的.另外,如果有人能给我一个提示,在哪里可以获得用于内容定义的分块和指纹生成的C++源代码,我将不胜感激.

Ant*_*ine 5

在你的第一个语句中,你将一个整数(i是一个整数类型,对吗?)添加到a 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
Run Code Online (Sandbox Code Playgroud)

在你的第二个声明中:

char *b=(char *)(buf);
char cur_byte=*(b+i);
Run Code Online (Sandbox Code Playgroud)

你先分配bufb,然后分配的内容b + icur_byte.b有类型,char*所以添加后i会给出地址i字符b.

Memory: |a| |w|o|r|d|
         ^       ^
        buf         
         b      b+i
Run Code Online (Sandbox Code Playgroud)

最后这两个陈述是等价的(除了分配b).

  • "使用void指针的指针算法不是由C标准定义的" - 但是GCC允许它作为非迂腐模式的扩展,这可能就是为什么首先编写引发错误的代码的原因.GCC的扩展实际上只是为了指针算术的目的,`sizeof(void)== 1`.因此,所有这些代码片段在GCC中都是等效的. (2认同)