0

我在一本书中找到了这段代码:

#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;
4

1 回答 1

5

要回答您的问题:

在您的示例中,除了可读性之外没有区别。

而且,正如这篇文章的评论所暗示的那样,不要在这里使用括号......

其他有趣的案例

在取消引用的对象上使用属性/方法

另一方面,如果您有类似的东西,则会有所不同

*myObject.myPropertyPtr += 10

相比

(*myPointer).myProperty += 10

我在这里选择的名字告诉你区别是什么:解引用操作符*适用于它右手边的任何东西;在第一种情况下,运行时将获取 的内容myObject.myPropertyPtr,并取消引用它,而在第二个示例中,它将取消引用myPointer,并myProperty从指向的对象上找到的任何内容中获取myPointer

后者非常常见,甚至有自己的语法:myPointer->myProperty.

使用++运算符而不是+=

另一个有趣的例子,我在阅读了这个问题的另一个(现已删除)答案后想到的,是这些之间的区别:

*myPointer++
(*myPointer)++
*(myPointer++)

这更有趣的原因是因为++它像任何其他调用一样,特别是不处理左右手边的值,它比你的例子更模棱两可+=。(当然,它们并不总是有意义 - 有时您最终会尝试在++不支持它的对象上使用运算符 - 但如果我们将研究限制为ints,这不会成为问题。而且无论如何它应该给你一个编译器错误......)

既然你引起了我的好奇心,我做了一个小实验来测试这些。这是我发现的:

  • *myPointer++做同样的事情*(myPointer++),即首先增加指针,然后取消引用。这不应该如此令人惊讶 - 这是我们期望知道运行结果的结果*myObject.someProperty

  • (*myPointer)++做你所期望的,即首先取消引用指针,然后增加指针指向的任何内容(并保持指针不变)。

如果您愿意,请随时仔细查看我用来查找此内容的代码。只需将其保存到dereftest.cpp,使用编译g++ dereftest.cpp -o dereftest(假设您安装了 G++)并使用./dereftest.

于 2013-02-09T19:17:52.187 回答