Код:
#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?
C/C++
Указатели в с++
Две ошибки:
В массиве пропущена запятая после 99 из за чего "99 -1" воспринимается как одно число. Соответственно кол-во элементов 5 а не 6.
Правильно писать unptr++ чтобы вывод был с нулевого элемента. Для ++unptr вывод будет с первого, а последний - выйдет за пределы массива.
В массиве пропущена запятая после 99 из за чего "99 -1" воспринимается как одно число. Соответственно кол-во элементов 5 а не 6.
Правильно писать unptr++ чтобы вывод был с нулевого элемента. Для ++unptr вывод будет с первого, а последний - выйдет за пределы массива.
Plastek-Yurga Plastek-Yurga
Благодарю. Да, пропустила запятую, как поставила, так всё заработало и ответ стал логичнее
В строке Б выводятся значения, на которые указывает указатель unptr после смещения на i элементов. На первой итерации i = 0, поэтому будет выведено значение, на которое указывает unptr. Затем unptr смещается на 1 элемент, и на следующей итерации (i = 1) будет выведено значение, на которое указывает unptr+1, то есть второй элемент массива untab. Аналогично, на каждой последующей итерации будет выводиться значение следующего элемента массива.
Изначально указатель unptr указывает на первый элемент массива untab. При использовании выражения *(++unptr) указатель сначала смещается на следующий элемент массива (увеличивается на 1), а затем разыменовывается (выполняется операция "разыменование" указателя), чтобы получить значение элемента. Если заменить выражение на *unptr++, то указатель также сначала разыменовывается, чтобы получить значение элемента, а затем смещается на следующий элемент. Однако приоритет операторов в данном случае отличается, поэтому если использовать выражение *unptr++, то указатель сначала разыменуется, а затем сместится на следующий элемент, то есть значение, которое будет выведено на последней итерации цикла, будет соответствовать шестому элементу массива untab, а не нулю, как в случае с *(++unptr).
Изначально указатель unptr указывает на первый элемент массива untab. При использовании выражения *(++unptr) указатель сначала смещается на следующий элемент массива (увеличивается на 1), а затем разыменовывается (выполняется операция "разыменование" указателя), чтобы получить значение элемента. Если заменить выражение на *unptr++, то указатель также сначала разыменовывается, чтобы получить значение элемента, а затем смещается на следующий элемент. Однако приоритет операторов в данном случае отличается, поэтому если использовать выражение *unptr++, то указатель сначала разыменуется, а затем сместится на следующий элемент, то есть значение, которое будет выведено на последней итерации цикла, будет соответствовать шестому элементу массива untab, а не нулю, как в случае с *(++unptr).
Похожие вопросы
- Различие указателей int *; и char *;
- Не совсем понял как работает C++ код с указателями
- Если указатель уже объявлен как указатель то при повторном объявлении мы обращаемся не к указателю а к адресу ссылки?
- Передача в метод класса указателя на функцию C++
- C/C++ Как устроена память, выделенная для структуры с указателем *next?
- В чём причина? Понторезов с очень высшим образованием слушать не буду. Только тех, кто практикует работу с указателями вС++
- Указатели. Типизированные указатели. Указатели та массивы. Функции пользователя
- Ссылки и указатели
- Указатели. Программирование с использованием динамических двухмерным масивов.
- Если указатель работает с указателем повторное объявление указателя не является не обходимым?