我在一本书中找到了这段代码:
#include <iostream>
using namespace std;
void ChangesAreGood(int *myparam) {
(*myparam) += 10;
cout << "Inside the function:" << endl;
cout << (*myparam) << endl;
}
int main() {
int mynumber = 30;
cout << "Before the function:" << endl;
cout << mynumber << endl;
ChangesAreGood(&mynumber);
cout << "After the function:" << endl;
cout << mynumber << endl;
return 0;
}
它说:
(*myparam) += 10;
以下产生了什么不同?
*myparam += 10;
答案 0 :(得分:5)
在您的示例中,除了可读性之外没有区别。
而且,由于这篇文章的评论都是暗示,请不要在这里使用括号......
另一方面,如果您有类似
的内容,那么就是*myObject.myPropertyPtr += 10
与
相比(*myPointer).myProperty += 10
我在这里选择的名字告诉你区别的是:解除引用运算符*
适用于右侧的任何内容;在第一种情况下,运行时将获取myObject.myPropertyPtr
的内容,并取消引用,而在第二个示例中,它将取消引用myPointer
,并从对象上找到的任何内容中获取myProperty
myPointer
指向。
后者很常见,甚至有自己的语法:myPointer->myProperty
。
++
运算符而不是+=
另一个有趣的例子,我在读完这个问题的另一个(现已删除的)答案之后想到的是这些之间的区别:
*myPointer++
(*myPointer)++
*(myPointer++)
这更有趣的原因是因为++
是一个像其他任何一个调用,特别是不处理左侧和右侧值,它比{{1}的示例更模糊}。 (当然,它们并不总是有意义的 - 有时你最终会尝试在不支持它的对象上使用+=
运算符 - 但是如果我们将研究限制为++
s ,这不会是一个问题。无论如何它应该给你一个编译错误......)
由于你引起了我的好奇心,我进行了一个小实验来测试这些。这就是我发现的:
int
与*myPointer++
做同样的事情,即 first 增加指针,然后取消引用。这不应该是如此令人惊讶 - 这是我们期望知道运行*(myPointer++)
的结果。
*myObject.someProperty
执行您期望的操作,即首先取消引用指针,然后增加指针指向的任何内容(并保留指针)按原样)。
如果您愿意,请随时仔细查看the code I used to find this out。只需将其保存到(*myPointer)++
,使用dereftest.cpp
进行编译(假设您已安装G ++)并使用g++ dereftest.cpp -o dereftest
运行。