之间有什么区别
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 ++源代码,我将不胜感激。
答案 0 :(得分:5)
在你的第一个语句中,你添加一个整数(i
是一个整数类型,对吗?)到void*
,然后再转换为char*
。使用void指针的指针算法不是由C标准定义的,因为编译器无法知道它应该增加多少指针。但是,有些编译器会定义sizeof(void) == 1
。在这种情况下,您的两个片段是等效的,这解释了为什么此代码可能与另一个编译器一起工作(感谢Steve Jessop指出这个)。
你在第一个片段中的含义可能是
char cur_byte=*(((char *) buf) + i);
,地址指向的字符位于buf之后的i
个字符。
在以下架构中,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
会在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
。