Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Как понять этот константный указатель? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Модули в C++ http://www.cyberforum.ru/cpp/thread82094.html
Доброе время суток! Помогите мне пожалуйста со следующей проблемой. Никак не розберусь с модулями на C++. Создаю один header файл с рассширением .H . Пишу в нём заголовки функций. Создаю второй...
C++ Обработка битовых последовательности (Срочно) Решите пожалуйста задачу на с++ НЕ че не могу сделать, голову сломал, напишите плиз а то я у же в очередье на отчисления в универе Тема: Обработка битовых последовательности Требования: 1)... http://www.cyberforum.ru/cpp/thread82006.html
Сижу на зачете !! C++
Народ, плиз помоите. сижу на зачете. Написать прогу котрая считывает массив целых чисел с клавиатуры, пользователь вводит значение и прога ищет это значение в массиве... ПЛИЗ с использованием...
Страж включения - это... ? C++
Всем доброго времени суток. Меня заинтересовал такой вот вопрос - Что такое "Страж включения", для чего используется, и "с чем его едят" ? ))
C++ Ошибка сегментации... http://www.cyberforum.ru/cpp/thread81539.html
Пытаюсь написать программу, которая может хранить массив из произвольного числа объектов класса. Но при попытке записать данные в класс, программа вылетает. Как же быть? Оператор new - НЕ...
C++ ошибка vs когда пытаюсь запустить игру выходит ошибка http://www.cyberforum.ru/games/thread42138-page2.html мне кажется что это из-за visual studio , помогите может кто знает в чём проблема. Добавлено... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
03.01.2010, 13:47
OVERPOWER8, модификаторы всегда действуют на тип-указатель или переменную, которые написаны справа от модификатора. Это неформальное объяснение

C
1
int const a;
Справа от const находится переменная. Означает, что константной является переменная, т.е. в неё записывать нельзя. Однако формально с точки зрения языка мы имеем переменную "a" с типом "const int". Это означает, что для конструкции

C
1
int *b = &a;
компилятор выругается на неявное преобразование, поскольку переменная b имеет тип "указатель на int", а выражение "&a" имеет тип "указатель на const int". По умолчанию такое преобразование считается опасным, т.к. по языку через "b" можно будет сделать запись в "a". Поэтому компилятор пропустит такой код только с явным преобразованием

C
1
int *b = (int*) &a;
а после любого явного преобразования указателей компилятор снимает с себя всякую ответственность за неправильный код типа

C
1
2
3
4
5
6
7
8
const int a = 5;
int *b = (int*) &a;
...
/* Здесь мы изменили значение переменной a, которую описали с модификатором
 * const. В случае работы с оптимизациями компилятор может нижеидущий
 * код "x=a" заменить на "x=5", поскольку "a" описано как немодифицируемая переменная */
*b = 6;
int x = a;
Ну и следует упомянуть, что зачастую пишут

C
1
const int a;
что является эквивалентной записью, поскольку, как я уже говорил, неформально модификатор const действует ТОЛЬКО на типы-указатели и переменные. Т.е. const по сути действует на "a", поскольку "int" не является типом-указателем

---------------------------

C
1
int const *c;
или, как чаще пишут

C
1
const int *c;
В данном случае const действует на тип-указатель "int*". В итоге мы имеем переменную "c", которая имеет тип "const int*", что есть "указатель на const int". Конструкция означает, что мы имеем указатель, по которому нельзя ничего модифицировать и который указывает на немодифицируемую память

При этом с указателями const есть некий тонкий момент. Программист обязан сам следить за тем, чтобы во время жизни переменной с типом "указатель на const" он всегда смотрел на немодифицируемые участки памяти. С точки зрения синтаксиса следующий код является коректным

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const int *c;
int d;
 
/* На такую конструкцию компилятор НЕ должен ругаться, т.к.
 * с точки зрения поинтерных записей конструкция опасной не является,
 * т.е. через указатель "c" мы не можем модифицировать
 * значение переменной "d" */
c = &d;
...
int x = *c;
...
/* В этом месте код формально становится некорректным, т.к. компилятор
 * в режиме с оптимизациями имеет право нижеидущий код "y=*c"
 * заменить на "y=x", поскольку "c" должно указывать на неизменяемую
 * память */
d++;
...
int y = *c;
но на исполнении в теории может повести себя не так, как ожидалось (зависит от компилятора)

--------------------------------------

Вкратце можно сказать про два назначения модификатора const:

1. Уберечь от собственных ошибок на этапе компиляции. Понятно, что на этапе текстового разбора могут выявиться только ошибки, где идёт запись напрямую через переменную с модификатором const (или типа которой есть указатель на const).
2. Оптимизация кода компилятором. В реальной жизни оказалось так, что программисты слишком часто пишут неправильные коды (по типу того, что я указывал выше), поэтому большинство современных компиляторов по умолчанию НЕ делают никаких оптимизаций, связанных с модификатором const, а делают только по специальным опциям
21
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru