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

问题描述:

这些表达式的结果是否相同?指针算术 - 相同的表达式?

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

我主要是一个Java开发人员,并且已经被分派重新编译从VS2008到VS2015的旧项目。上面的第一行导致编译错误,因为左操作数不是可修改的l值。问题是如果我可以使用第二个表达式而不是第一个表达式,因为根据我的理解,它们应该是相同的?

该ptr类型为char*

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

+0

那么,你是说在VS2008下的第一个_did_编译?如果是这样,编译器正在做一些非标准的事情,并不清楚它是否实际上改变了'ptr'的值,或者改变了临时指针的值并抛出了这个结果。我建议谨慎。 –

+0

它的确做到了。我发现它也很麻烦,现在知道编译器无法访问第一个表达式。害怕我会纠正一直在“破碎”的东西。 – Sarynn

+3

第一个是荒谬的,老实说,我不知道重点会是什么,我认为我们需要更多的背景。它们不会完全相同,因为编译器说第一次尝试修改一个临时地址,如果它编译它可能对'ptr'没有任何影响,但是您可以始终使用旧编译器并亲自查看。 – George

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

所以没有声明是不一样的。

编辑: 有趣的是,它编译VS2008。编译器必须将&定义为一个可修改的值(实质上只是创建一个指向该地址的指针)。这可能只是编译器中的一个错误。如果您需要将代码转换为语法上的正确,那么第二个表达式应该会很好。假设你想要修改ptr的最终结果。 (自从声明使用+ =以来,我觉得那是想要的语义)。