gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:09:00 25 4
gpt4 key购买 nike

有什么区别

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

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

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

最佳答案

在您的第一个语句中,您将一个整数(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_byteb 的类型为 char* 因此添加 i 将在 b 之后给出地址 i 个字符>.

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

最后这两个语句是等价的(除了b的赋值)。

关于c - 这两个涉及指针算术的语句有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8179821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com