指针算术 - 相同的表达式?

时间:2017-10-20 06:53:58

标签: c++ pointers visual-studio-2008

这些表达式的结果是否相同?

&(*ptr) += 4 // Expression 1
ptr += 4 // Expression 2

我主要是一名Java开发人员,他的任务是将一个旧项目从VS2008重新编译到VS2015。由于左操作数不是可修改的l值,因此上面的第一行导致编译错误。问题是我是否可以使用第二个表达式而不是第一个表达式,因为根据我的理解它们应该是相同的?

ptr的类型为char*

非常感谢有关此问题的任何见解和/或帮助。

1 个答案:

答案 0 :(得分:1)

&返回左值的地址,但其本身不可修改,因此(&a)++没有意义,因为您无法分配给&a。所以第一个表达式不是定义的操作。 (因此左操作数的错误不是可修改的左值)。另外&(*ptr) = ptr因为你正在取消引用指针然后抓取地址,而&(*ptr)是一个有效的语法结构,这是毫无意义的。第二个语句将指针移到4个内存地址上。

所以这些陈述不一样。

编辑: 有趣的是它在VS2008上编译。编译器必须将&定义为可修改的值(基本上只是从地址创建指针)。这可能只是编译器中的一个错误。如果你需要将代码转换为语法正确,那么第二个表达式就可以了。假设您希望修改ptr的最终结果。 (因为语句使用+ =,我觉得这是想要的语义)。