как работает указатель при перемещении на массив целых

0

У меня вопрос о следующем коде. строка 1 может быть переписана как * (p++) = * (p++) +123;
правая часть 6 +123 = 129, которую я понимаю. Но как это назначить левой стороне?
что делает * (p++) работает как левая сторона? благодарю!

    int a[] = {6,7,8,9,10};
    int *p = a;
    *(p++)+=123; //array 129 7 8 9 10     line 1  
    cout<<*p<<endl;// 7

    *(++p)+=123;// array 129 7 131 9 10   line 2
    cout<<*p<<endl;// 131
Теги:
arrays
pointers
int

3 ответа

4
Лучший ответ

строка 1 может быть переписана как *(p++) = *(p++)+123;

Нет, не может; что увеличит p вдвое. Он может быть (приблизительно) переписан как

int & r = *p++;
r = r + 123;

в то время как строка 2 больше похожа на

++p;
*p = *p + 123;

Но как это назначить левой стороне? что делает * (p++) работает как левая сторона?

p++ оценивает временное сохранение старого значения p. *(p++) которые дают присваиваемое значение lvalue, относящееся к объекту p на который указывает точка. += изменяет этот объект.

(ПРИМЕЧАНИЕ: Я пишу о C++, хотя вы, кажется, спрашиваете о двух разных языках. Ответ, вероятно, очень похож на C, хотя некоторые из стандартных терминов могут отличаться. В будущем, пожалуйста, выберите, какой язык вы используете, спрашивать о.)

  • 0
    Но разве это не для каждого a + = b равно a = a + b? или есть правило + =? какой-то документ?
  • 1
    @ user2879534: a+=b эквивалентно a=a+b за исключением того, что a оценивается только один раз.
1

Это очень короткий код. Вот более длинная версия:

int a[] = {6,7,8,9,10};
int *p = a;
*p += 123; //array 129 7 8 9 10     line 1  
p++; // p points to a + 1
cout << *p << endl;// 7

++p; // p points to p + 1 = a + 2
*p += 123;// array 129 7 131 9 10   line 2
cout << *p << endl;// 131

По существу: p++ означает return p и увеличивает его после, тогда как ++p означает, что он увеличивает его и возвращает результат.

1

после выполнения

int a[] = {6,7,8,9,10};
int *p = a;

у вас в памяти есть что-то подобное

  -------------------- 
 | 6 | 7 | 8 | 9 | 10 |
  -------------------- 
   |
   a,p 

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

  ----------------------
 | 129 | 7 | 8 | 9 | 10 |
  ---------------------- 
   |
   a,p 

и второй оператор увеличивает p
p++;
и вы получите это в памяти

  ----------------------
 | 129 | 7 | 8 | 9 | 10 |
  ---------------------- 
   |     |
   a     p

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

  ----------------------
 | 129 | 7 | 8 | 9 | 10 |
  ---------------------- 
   |         |
   a         p

и второе утверждение
(*p) += 123;//p is pointing at 8, (*p) += 123;//p is pointing at 8, и вы получаете это в памяти

  ------------------------
 | 129 | 7 | 131 | 9 | 10 |
  ------------------------ 
   |         |
   a         p

Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню