有什么区别
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++源代码,我将不胜感激.
在你的第一个语句中,你将一个整数(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)
你先分配buf到b,然后分配的内容b + i来cur_byte.b有类型,char*所以添加后i会给出地址i字符b.
Memory: |a| |w|o|r|d|
^ ^
buf
b b+i
Run Code Online (Sandbox Code Playgroud)
最后这两个陈述是等价的(除了分配b).