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

  Юрий  | 

  |

  Обновл. 13 Сен 2021  | 

 78870

 ǀ   6 

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

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

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

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

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

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


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

В примере, приведенном выше, ptr указывает на константный целочисленный тип данных.

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

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

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

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

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

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

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

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

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


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

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

Заключение

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

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

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

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

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

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

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


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

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

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

  1. Алексей:

    Для лучшего понимания очередности написания типа данных, звездочки и слова const в объявлении указателя, можно прибегнуть к простому приему — прочитать полученную конструкцию справа налево: const int *ptr1 — значит ptr1 — указатель на int константный
    int *const ptr2 — значит ptr2 — константный указатель на int

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

      Спасибо, хороший совет!

  2. Александр:

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

    и

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

    1. fan78:

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

  3. Евгений:

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

    1. Фото аватара Юрий:

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

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

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