Почему я не могу увеличить значение переменной int с помощью «++» при работе с указателями? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь увеличить значение элемента внутри массива, используя указатель, хранящий адрес этого элемента.

Когда я пишу это как "p ++;", это не работает, тогда как если я пишу этокак *p=*p+1 это работает.

*p=*p+1; // this increments the value
*p++; //while this does not

Я ожидаю обоих способов работы

Ответы [ 2 ]

5 голосов
/ 13 апреля 2019

operator ++ имеет более высокий приоритет, чем разыменование, поэтому *p++ увеличивает указатель, а затем выполняет разыменование. Если вы хотите увеличить значение, на которое оно изначально указывает, вам нужно добавить круглые скобки: (*p)++;

0 голосов
/ 13 апреля 2019
#include <iostream>
using namespace std;

int main (int argc, char *argv[])
{
  int numbers[] = { 100, 200, 300, 400, 500, 600 };
  int *p1 = &numbers[0];
  int *p2 = &numbers[2];
  int *p3 = &numbers[4];
  *p1 = *p1 + 1;
  *p2 = *p2++;
  ++*p3;
  cout << numbers[0] << " " << numbers[1]  << " " << numbers[2] << " " <<  numbers[3] << " " <<  numbers[4] << " " <<  numbers[5];
}

Запуск этого через XCode дает мне подсказку относительно того, что идет не так, как говорится: «temp / test.cxx: 11: 12: предупреждение: непоследовательная модификация и доступ к 'p2' [-Wunsequenced]».

Вывод 101 200 300 300 501 600.

Первый метод работает, как вы сказали в своем вопросе.

Второй делает что-то совершенно отличное от того, что вы ожидали: этопринимает значение, на которое указывает p2 (300), затем увеличивает указатель и сохраняет значение обратно на этот новый адрес.

Третий пример с p3 ближе к тому, чего вы пытаетесь достичь, я думаю.

...