Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针算术-相同表达式?_C++_Pointers_Visual Studio 2008 - Fatal编程技术网

C++ 指针算术-相同表达式?

C++ 指针算术-相同表达式?,c++,pointers,visual-studio-2008,C++,Pointers,Visual Studio 2008,这些表达式的结果相同吗 &(*ptr) += 4 // Expression 1 ptr += 4 // Expression 2 我主要是一名Java开发人员,负责从VS2008到VS2015重新编译一个旧项目。上面的第一行由于左操作数不是可修改的l值而导致编译错误。问题是我是否可以使用第二个表达式而不是第一个表达式,因为从我的理解来看,它们应该是相同的 ptr的类型为char* 非常感谢您在此问题上提供的任何见解和/或帮助。&返回左值的地址,但其本身不可修改,因此(&a)+没有意义

这些表达式的结果相同吗

&(*ptr) += 4 // Expression 1
ptr += 4 // Expression 2
我主要是一名Java开发人员,负责从VS2008到VS2015重新编译一个旧项目。上面的第一行由于左操作数不是可修改的l值而导致编译错误。问题是我是否可以使用第二个表达式而不是第一个表达式,因为从我的理解来看,它们应该是相同的

ptr的类型为
char*


非常感谢您在此问题上提供的任何见解和/或帮助。

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

所以不,这些陈述是不一样的

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

那么,你是说第一个是在VS2008下编译的吗?如果它这样做了,编译器正在做一些非标准的事情,并且不清楚它是否真的改变了
ptr
的值,或者改变了临时指针的值并丢弃了结果。我建议你小心点,是的。现在我知道编译器无法访问第一个表达式,我也觉得这很麻烦。恐怕我会纠正一些一直“坏”的东西。第一个是荒谬的,老实说,我不知道重点是什么,我认为我们需要更多的背景。它们不会完全相同,因为正如编译器所说,第一次尝试修改临时地址时,如果它要编译,它可能对
ptr
没有影响,但您可以始终使用旧的编译器自己查看。@Ron:显然,第一个表达式是编译的。这就是为什么很难回答这个问题。你需要弄清楚VS2008用它做了什么。如果它修改了一个临时版本,然后立即放弃了该临时版本,则表达式2不是正确的替代品。@mAlters:谢谢,一旦新版本启动并运行,我将比较这两个版本。实际上现在变成了一个有趣的问题。