Урок 87. Указатели и const

   ⁄ 

 Обновлено 14 Окт 2017

  ⁄   

⁄  2

В этом уроке мы рассмотрим указатели на константные переменные, указатели на константные значения, константные указатели и константные указатели на константные значения.

Указатели на константные переменные

До этого момента все указатели, которые вы видели, были неконстантными указателями на неконстантные значения:

Однако, что произойдет, если значение будет const?

Фрагмент выше не скомпилируется — мы не можем присвоить неконстантному указателю константную переменную. Здесь есть смысл: ведь на то она и константа, что её значение нельзя изменить. Гипотетически, если бы мы могли присвоить значение const неконстантному указателю, тогда мы могли бы разыменовать неконстантный указатель и изменить значение этой же константы. А это уже является нарушением самого понятия «константа».

Указатели на константные значения

Указатель на константное значение — это указатель (неконстантный), который указывает на неизменное значение.

Для объявления указателя на константное значение — используется ключевое слово const перед типом данных:

В примере выше ptr указывает на тип данных — const int.

Пока что всё хорошо. Рассмотрим следующий пример:

Указатель на константную переменную может указывать на неконстантную переменную (как в случае с переменной value в примере выше). Подумайте об этом так: указатель на константную переменную обрабатывает переменную как константу при получении доступа к ней через указатель, независимо от того, была ли эта переменная изначально определена как const или нет.

Таким образом, следующее в порядке вещей:

Но не это:

Указателю на константное значение, который сам при этом не является константным (он просто указывает на значение const), можно присвоить и другое значение:

Константные указатели

Мы также можем сделать указатель константным. Константный указатель — это указатель, значение которого не может быть изменено после инициализации.

Для объявления константного указателя — используется ключевое слово const между звездочкой и именем указателя:

Подобно обычным константным переменным, константный указатель должен быть инициализирован значением при объявлении. Это означает, что он всегда будет указывать на один и тот же адрес. В примере выше ptr всегда будет укзаывать на адрес value (до тех пор, пока указатель не выйдет из области видимости и не уничтожится).

Однако, поскольку переменная value, на которую указывает указатель, не является константой, то её значение можно изменить путем разыменования константного указателя:

Константные указатели на константные значения

Наконец, можно объявить константный указатель на константное значение, используя ключевое слово const как перед типом данных, так и перед именем указателя:

Константный указатель на константное значение нельзя перенаправить указывать на другое значение, также как и значение, на которое он указывает, нельзя изменить.

Итого

Подводя итоги, вам нужно запомнить всего лишь 4 правила:

  неконстантный указатель можно перенаправить указывать на любой другой адрес;

  с помощью указателя на неконстантное значение можно изменить это же значение (на которое он указывает);

  константный указатель всегда указывает на один и тот же адрес, и этот адрес не может быть изменен;

  указатель на константное значение обрабатывает значение как константное (даже если оно таковым не является) и, следовательно, это значение через указатель изменить нельзя.

А вот с синтаксисом может быть немного труднее. Просто помните, что тип значения, на который указывает указатель, всегда находится слева, в самом начале:

Указатели на константные значения в основном используются в параметрах функций (например, при передаче массива) для гарантии того, что функция случайно не изменит значение/значения переданного ей аргумента.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (3 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Комментариев: 2

  1. Евгений:

    Спасибо Вам за этот цикл по С++ !!! Читаю его и понимаю что мыслить начинаю так, как должен мыслить программист пишущий на С++. )) Шаг за шагом становится всё интересней. Если раньше открывая программу на С++ с ужасом закрывал её, то теперь понимаю ход мыслей человека который её написал.

    1. Li4ik:

      Спасибо 🙂 У меня с самого начала такое же ощущение. Всё валится не сразу и наповал, а действительно, шаг за шагом.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *