C/C++

Указатели в с++

Код:

#include <iostream>

using namespace std;

/// Вопрос 2:

int main ()
{
int untab [] = {9, 12, 99 -1, 3,0};
int *unptr;

unptr = untab;

for (int i=0; i<6;i++){
cout << "tab[" << i << "]" << untab[i] << endl; //строка А
cout << "unptr+" << i << "= " << *(++unptr) << endl; //строка Б
}

}

В строке Б, как повляются цифры 98,0,0,0?

И почему если заменить *(++unptr) на *unptr++ результат будет тот же, кроме i = 5?
Две ошибки:
В массиве пропущена запятая после 99 из за чего "99 -1" воспринимается как одно число. Соответственно кол-во элементов 5 а не 6.
Правильно писать unptr++ чтобы вывод был с нулевого элемента. Для ++unptr вывод будет с первого, а последний - выйдет за пределы массива.
Акылбек Булатов
Акылбек Булатов
51 416
Лучший ответ
Plastek-Yurga Plastek-Yurga Благодарю. Да, пропустила запятую, как поставила, так всё заработало и ответ стал логичнее
В строке Б выводятся значения, на которые указывает указатель unptr после смещения на i элементов. На первой итерации i = 0, поэтому будет выведено значение, на которое указывает unptr. Затем unptr смещается на 1 элемент, и на следующей итерации (i = 1) будет выведено значение, на которое указывает unptr+1, то есть второй элемент массива untab. Аналогично, на каждой последующей итерации будет выводиться значение следующего элемента массива.

Изначально указатель unptr указывает на первый элемент массива untab. При использовании выражения *(++unptr) указатель сначала смещается на следующий элемент массива (увеличивается на 1), а затем разыменовывается (выполняется операция "разыменование" указателя), чтобы получить значение элемента. Если заменить выражение на *unptr++, то указатель также сначала разыменовывается, чтобы получить значение элемента, а затем смещается на следующий элемент. Однако приоритет операторов в данном случае отличается, поэтому если использовать выражение *unptr++, то указатель сначала разыменуется, а затем сместится на следующий элемент, то есть значение, которое будет выведено на последней итерации цикла, будет соответствовать шестому элементу массива untab, а не нулю, как в случае с *(++unptr).
Marin Bakardzhiev
Marin Bakardzhiev
2 636