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

  Юрий  | 

  Обновл. 28 Июн 2019  | 

 18715

 ǀ   4 

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

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

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

Однако, что произойдёт, если указатель будет указывать на константную переменную?

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

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


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

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

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

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

Но не следующее:

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

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

Мы также можем сделать указатель константным. Константный указатель — это указатель, значение которого не может быть изменено после инициализации. Для объявления константного указателя используется ключевое слово const между звёздочкой и именем указателя:

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

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

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


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

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

Заключение

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

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

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

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

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

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

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


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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (131 оценок, среднее: 4,89 из 5)
Загрузка...

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

  1. Аватар Александр:

    Есть ли разница между

    и

    ?
    Это просто вопрос договоренностей и стиля или есть различия между этими формами?

    1. Аватар fan78:

      Нет никакой разницы. Сама const может быть в любой части. Даже можно в серединке: unsigned const int

  2. Аватар Евгений:

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

    1. Юрий Юрий:

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

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

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