C ++ оператор ++ и указатели - PullRequest
3 голосов
/ 21 марта 2012

Я делаю первые шаги в C ++, обладаю хорошим опытом в Java. Мне нужно прояснить некоторые особенности оператора ++ в 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 ]

9 голосов
/ 21 марта 2012

оператор * работает после ++, поэтому он возвращает значение неправильного адреса. приоритет оператора важно знать в c ++. взгляните на это:

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

2 голосов
/ 21 марта 2012

Проблема с приоритетом оператора. Попробуйте (*px)++;

0 голосов
/ 21 марта 2012

Ого, так много людей не знают, как работают операторы C ++. :)

Все правы в том, что указывают на то, что это проблема с порядком старшинства, однако именно эта проблема, похоже, ускользает от всех.

* р ++; как утверждение делает только одну вещь. Увеличивает указатель. После оценки и разыменования его оригинального значения (которое в этом случае игнорируется).

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

В приведенном выше примере c будет равно 10, а b будет указывать на второй элемент a (20). Потому что указатель b будет оцениваться до приращения.

0 голосов
/ 21 марта 2012

Приоритет для ++ больше, чем *.Следовательно (px ++) рассчитывается.Теперь * (px ++) - пустое утверждение.Вы не присваиваете и не читаете значение из местоположения.Кроме того (px ++) имеет адрес местоположения, которое может не инициализироваться.Итак, вы получаете значение мусора.

0 голосов
/ 21 марта 2012

Это проблема приоритета:

*px = *px +1 читается как (*px) = (*px) + 1, а поскольку px = & x, это похоже на x=x+1.

*px++ читается как *(px++) следовательно, вы фактически перемещаете указатель вперед и получаете значение того, что память занимает в качестве следующей позиции по отношению к переменной x (скорее всего, мусор).

0 голосов
/ 21 марта 2012

* px + 1 принимает значение, на которое указывает px, и добавляет его на 1

* px ++ сначала увеличивает адрес, а затем принимает значение px, равное

0 голосов
/ 21 марта 2012

Когда вы делаете *px++, вы фактически добавляете 1 к адресу, а затем получаете значение.Вы, скорее всего, имели в виду (*px)++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...