在C ++中,表达式“* pointer ++”如何工作?

时间:2010-12-12 20:00:44

标签: c++ pointers operators

#include <iostream>
using namespace std;

int main () {
    int value = 1, *pointer;
    pointer = &value;
    cout << *pointer++ << endl;
    cout << *pointer << endl;
}

为什么++运算符不会增加value

6 个答案:

答案 0 :(得分:10)

Post-increment (++) has higher precedence than dereference (*).这意味着++绑定到pointer而不是*pointer

请参阅C FAQ 4.3及其中的参考资料。

答案 1 :(得分:7)

好的,每个人都解释了参数的绑定 但是没有人提到它意味着什么。

int    data[1,2,3,4,5];

int*   pointer = data;

std::cout << *pointer++ << std::endl;
std::cout << *pointer   << std::endl;

如上所述,++运算符具有更高的优先级,因此比*运算符更紧密。所以表达式也是等价的:

std::cout << *(pointer++) << std::endl;
std::cout << *pointer << std::endl;

但是operator ++是后缀版本。这意味着指针递增但操作结果返回原始值以供*运算符使用。因此,我们可以修改语句如下;

std::cout << *pointer << std::endl;
pointer++;
std::cout << *pointer << std::endl;

因此输出的结果是当前指向的整数,但指针也会递增。所以打印的值是

1
2

2
3

答案 2 :(得分:3)

++的优先级高于*,因此您的表达式等同于*(pointer++) - 它取消引用该值,然后递增指针,而不是值。如果要增加值,则需要执行(*pointer)++

答案 3 :(得分:2)

与做

是一回事
*(pointer++)

因为它增加了指针所占的地址,然后它取消引用它。

答案 4 :(得分:1)

*pointer++表示*(pointer++)

即,它会增加指针,而不是指针。

记住这一点的一种方法是阅读原始的K&amp; R“The C Programming Language”,其中strcpy的例子使用它。

无论如何,这就是我记住优先权的方式。

并且由于它递增指针,因此您的第二个取消引用具有未定义的行为。

欢呼&amp;第h。,

答案 5 :(得分:0)

您正在递增指针的值,而不是指向它的值。