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

问题描述 投票:0回答:6
#include <iostream>
using namespace std;

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

为什么

++
运算符不增加
value

c++ pointers operators
6个回答
9
投票

后自增 (

++
) 的优先级高于取消引用 (
*
)。
这意味着
++
绑定到
pointer
而不是
*pointer

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


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;

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

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

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

1
2

不是

2
3

3
投票

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


2
投票

这和做是一样的事情

*(pointer++)

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


1
投票

*pointer++
的意思是
*(pointer++)

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

记住这一点的一种方法是阅读原始的 K&R“C 编程语言”,其中

strcpy
的示例使用了此内容。

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

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

干杯,


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.