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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перехват и подмена вызываемых функций http://www.cyberforum.ru/cpp/thread46472.html
Здравствуйте. Нужно подменить вызов таких функций как open(), lstat(), stat(), read(), write(), mkdir(), chdir(), getcwd() для определенного процесса. Интересует мнение других. Как бы вы реализовали эту задачу. Спасибо!
 

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17307 / 5555 / 347
Регистрация: 30.03.2009
Сообщений: 15,119
Записей в блоге: 26
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, а делают только по специальным опциям
 
Текущее время: 19:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru