Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2017, 18:35   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Разыменование.

Здравствуйте!
Вот фрагмент кода
Код:
float* ptr=start_address;
for(int j=0; j<SIZE; j++)
cout<<*ptr++;
В учебнике говорится, что печатается значение которое стоит за указателем ptr после операции * разыменования.
А потом, указатель инкрементируется, и указывает на другую ячейку массива или контейнера другого типа.
Но ведь ptr то разыменован!! Он уже не указатель!
Или после вывода значения стоящего за указателем, ptr снова становится указателем, для следующего действия?
Как понимать? Подскажите пожалуйста.
KAMLS вне форума Ответить с цитированием
Старый 05.09.2017, 18:38   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

У вас каша в голове. Смотрите, есть 2 и после 2+4 она же не превращается в 6? Тут абсолютно так же: есть указатель и есть операции с ними. Разыменование не превращает указатель во что-то, он так и остается указателем.

P.S. Формально
Код:
*ptr++
эквивалентно
Код:
ptr.operator++(int).operator*()

Последний раз редактировалось p51x; 05.09.2017 в 18:42.
p51x вне форума Ответить с цитированием
Старый 05.09.2017, 18:52   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Но ведь ptr то разыменован!!
Нет. Рызыменование ничего не делает с самим указателем. Разыменование нужно делать каждый раз, когда по указателю берётся значение
Black Fregat вне форума Ответить с цитированием
Старый 05.09.2017, 18:53   #4
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо. Понял.

Последний раз редактировалось KAMLS; 05.09.2017 в 18:55.
KAMLS вне форума Ответить с цитированием
Старый 10.09.2017, 18:14   #5
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Еще раз в продолжение. Читаю учебник далее и вот новый пример.
Код:
(*iter++).display();
В предыдущем примере указатель не был в скобках. Там по порядку операции cout выводил значение разыменованного указателя, а потом указатель который остался самим собой инкрементировался.
Тут же итератор в скобках, и как компилятор понимает к какому действию применять функцию display? К значению разыменованного указателя, или к инкрементированному указателю?
KAMLS вне форума Ответить с цитированием
Старый 10.09.2017, 18:49   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Второй пост...

Код:
(*iter++).display(); -> ptr.operator++(int).operator*().display();
p51x вне форума Ответить с цитированием
Старый 10.09.2017, 18:50   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Операторы имеют приоритеты
http://ru.cppreference.com/w/cpp/lan...tor_precedence
Компилятор разбирает и выполняет вырожение в соотвествии с приоритетами.
суфикс ++ имеет высший приоритет чем приставка *.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.09.2017, 03:36   #8
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо. Понятно.
KAMLS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разыменование указателей alexander3 Помощь студентам 1 09.12.2012 02:47