c – 指针算术 – 相同的表达式?

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

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

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

ptr的类型为char *.

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

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

所以这些陈述不一样.

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

点赞