我在一本书中找到了这个代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
它说:
(*myparam) += 10;
Run Code Online (Sandbox Code Playgroud)
以下产生的不同之处是什么?
*myparam += 10;
Run Code Online (Sandbox Code Playgroud)
在您的示例中,除了可读性之外没有区别.
并且,正如这篇文章的评论都暗示的那样,请不要在这里使用括号...
另一方面,如果你有类似的东西,则会有所不同
*myObject.myPropertyPtr += 10
Run Code Online (Sandbox Code Playgroud)
相比
(*myPointer).myProperty += 10
Run Code Online (Sandbox Code Playgroud)
我在这里选择的名字告诉你有什么区别:解除引用操作符*适用于其右侧的任何内容; 在第一种情况下,运行时将获取内容myObject.myPropertyPtr,并取消引用,而在第二个示例中,它将取消引用myPointer,并myProperty从myPointer指向的对象上找到的任何内容中获取.
后者非常普遍,甚至有自己的语法:myPointer->myProperty.
++运算符而不是+=另一个有趣的例子,我在阅读这个问题的另一个(现在删除的)答案之后想到的是这些之间的区别:
*myPointer++
(*myPointer)++
*(myPointer++)
Run Code Online (Sandbox Code Playgroud)
这更有趣的原因是因为既然++是一个像其他任何一个调用,特别是不处理左手和右手的值,它比你的例子更模糊+=.(当然,它们并不总是有意义 - 有时候你最终会尝试++在不支持它的对象上使用运算符 - 但是如果我们将研究限制为ints,这将不会成为问题.它应该给你一个编译器错误...)
既然你引起了我的好奇心,我就进行了一个小实验来测试这些.这是我发现的:
*myPointer++做同样的事情*(myPointer++),即首先递增指针,然后取消引用.这不应该是如此令人惊讶 - 这是我们所期望的运行结果*myObject.someProperty.
(*myPointer)++做你期望的,即首先取消引用指针,然后递增指针指向的任何内容(并将指针保持原样).
如果你愿意的话,请随便仔细看看我用过的代码.只需保存dereftest.cpp,编译g++ dereftest.cpp -o dereftest(假设您已安装G ++)并运行./dereftest.
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |