C ++ operator ++和指针

时间:2012-03-21 08:09:37

标签: c++ pointers

我正在迈出具有Java背景的C ++的第一步。我需要清除C ++中++运算符的一些特性。请考虑以下程序:

#include <iostream>
using namespace std;
void __print(int x, int *px) {
 cout << "(x, *px) = (" << x << ", " << *px << ")" << endl;
}

int main() {
 int x = 99;
 int *px = &x;
 __print(x, px);
 x++; __print(x, px);
 x = x + 1; __print(x, px);
 *px = *px + 1; __print(x, px);
 *px++; __print(x, px);
 return 0;
}

令我惊讶的是,该程序打印出来:

(x, *px) = (99, 99)
(x, *px) = (100, 100)
(x, *px) = (101, 101)
(x, *px) = (102, 102)
(x, *px) = (102, 134514848)

似乎* px = * px + 1对* px的影响与x上的影响不同。但这些东西不一样吗?不是* px == x?

7 个答案:

答案 0 :(得分:9)

*运算符在++之后运行,因此它返回错误地址的值。在c ++中,运算符优先级很重要。看看这个:

http://en.cppreference.com/w/cpp/language/operator_precedence

答案 1 :(得分:2)

问题在于运营商优先级。试试(*px)++;

答案 2 :(得分:0)

执行*px++时,实际上会在地址中添加1,然后获取值。你很可能意味着(*px)++

答案 3 :(得分:0)

* px + 1获取px指向的值并将其加1

* px ++首先递增地址,然后取值px指向

答案 4 :(得分:0)

这是一个优先问题:

*px = *px +1读为(*px) = (*px) + 1,而且由于px =&amp; x,它就像x=x+1

*px++读取为*(px++),因此您实际上将指针向前移动并获取内存所占的值作为相对于x变量的下一个位置(很可能是垃圾)。

答案 5 :(得分:0)

++的优先级超过*。因此(px ++)被计算出来。现在*(px ++)是一个浪费的陈述。您既不分配也不从该位置读取值。此外(px ++)具有可能尚未初始化的位置的地址。所以你得到了垃圾值。

答案 6 :(得分:0)

哇,很多人不知道C ++运算符是如何工作的。 :)

每个人都指出这是优先顺序的问题是正确的,但问题究竟是什么,似乎是在躲避所有人。

* P ++;作为一个声明完全是一件事。它递增指针。在评估它并取消引用其原始值之后(在这种情况下会被忽略)。

int  a[ 2 ] = { 10, 20 };
int* b = &a[ 0 ];
int  c = *b++;

在上面的例子中,c等于10,b将指向(20)的第二个元素。因为指针b将在增量之前进行评估。