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

时间:2011-11-18 08:48:33

标签: c pointers void

之间有什么区别
 char cur_byte=*((char *)(buf+i));

char *b=(char *)(buf);
char cur_byte=*(b+i);

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

2 个答案:

答案 0 :(得分:5)

在你的第一个语句中,你添加一个整数(i是一个整数类型,对吗?)到void*,然后再转换为char*。使用void指针的指针算法不是由C标准定义的,因为编译器无法知道它应该增加多少指针。但是,有些编译器会定义sizeof(void) == 1。在这种情况下,您的两个片段是等效的,这解释了为什么此代码可能与另一个编译器一起工作(感谢Steve Jessop指出这个)

你在第一个片段中的含义可能是 char cur_byte=*(((char *) buf) + i);,地址指向的字符位于buf之后的i个字符。

在以下架构中,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_byteb的类型为char*,因此添加i会在i之后提供地址b个字符。

Memory: |a| |w|o|r|d|
         ^       ^
        buf         
         b      b+i

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

答案 1 :(得分:1)

区别在于(buf + i)(b + i)的对比。

b的类型为char*,因此(b + i)将指向b + sizeof(char) * i

buf可以是不同的类型,因此(buf + i)将指向buf + sizeof(BUFS_TYPE) * i