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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,658
Записей в блоге: 17
#1

const volatile - C++

13.08.2012, 03:53. Просмотров 2203. Ответов 29
Метки нет (Все метки)

Пример из Шилдт Г. "С++ Базовый курс (3-е издание, 2010)" стр 205

C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
const volatile

Непонятно почему Шилд называет это константным указателем на изменяемый объект.

Как я понимаю volatile здесь не играет ни какой роли в коде... а const относится к переменной, а не к указателю.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 03:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const volatile (C++):

const_cast: const и volatile - C++
Как известно const_cast сбрасывает наложенные ограничения при помощи модификаторов const и volatile. Как мне стало известно volatile -...

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

int\ volatile int \ const int - C++
Товарищи, паника! Имеется код: int a = 5; std::cout << "Init value a: " << a << "\n"; int *p; p = (int*) &a; *p = 0; ...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start->next;} return c; } Функция...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.08.2012, 04:32 #2
Вы книгу на английском найдите, тогда и видно будет, что имел ввиду автор
0
alkagolik
Заблокирован
13.08.2012, 07:31 #3
Avazart, volatile вполне актуально. const относится к данным.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    const volatile int *x;
    volatile const int y = 6, *z = &y;
    x = &y;
    x = z;
    //*x = 7; //error
 
    return 0;
}
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 07:59 #4
Всё, что стоит слева от звёздочки, относится к адресуемому объекту. Всё, что справа, — к самой переменной-указателю.

const volatile char *p; именно это и значит: вы не можете изменять значение объекта по адресу p, но вы всегда будете в курсе его изменений другими потоками или чем там ещё, кеши не будут мешать и всё такое, что обычно с volatile. И это не запрещает вам присвоить переменной p другое значение.
1
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,527
Записей в блоге: 26
13.08.2012, 08:51 #5
[Задача] const volatile

Другими словами, это указатель к read-only данные, которые являются volatile
1
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,658
Записей в блоге: 17
13.08.2012, 13:59  [ТС] #6
Цитата Сообщение от defer
Вы книгу на английском найдите, тогда и видно будет, что имел ввиду автор
Нашел там тоже самое написано.
Although it seems strange at first thought, it is possible to use const and volatile
together. For example, the following declaration is perfectly valid. It creates a const pointer to a volatile object.
C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
In this example, the cast is needed in order to transform the integer literal 0x2112
into a const volatile character pointer.
Цитата Сообщение от alkagolik Посмотреть сообщение
const относится к данным.
Ну и я о том, значит это указатель на константу, а не константный указатель
А
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Всё, что стоит слева от звёздочки, относится к адресуемому объекту.Всё, что справа, — к самой переменной-указателю.
Цитата Сообщение от alkagolik Посмотреть сообщение
volatile вполне актуально.
Почему тогда актуально? Если volatile также стоит до * как и const, а значит играет роль только const
0
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,527
Записей в блоге: 26
13.08.2012, 14:25 #7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну и я о том, значит это указатель на константу
Я уже писал как-то об этом, что это неверный перевод слова "constant"

В английском языке слово "constant" в первую очередь означает "постоянный", "неизменный". Ну а для русскоязычных людей как-то подсознательно на первый план вылезает "константа" (фиксированная числовая величина)
Другими словами, const-указатель, это НЕ указатель на константу, а указатель, по которому нельзя записывать

кое-что про const
1
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,658
Записей в блоге: 17
13.08.2012, 14:27  [ТС] #8
Читаю тему...

Цитата Сообщение от Evg Посмотреть сообщение
C++
1
extern volatile const int iii;
Модификатор const с одной стороны говорит о том, что переменная не может изменяться, но с другой стороны модификатор volatile означает, что переменная может изменяться неявным для компилятора образом. Поиском желательно не пользоваться, а попробовать догадаться самому
Цитата Сообщение от Evg Посмотреть сообщение
В конструкции const volatile модификатор const относится только к языковой части, но не к аппаратной. Т.е. переменную const volatile программист не имеет права менять (компилятор будет ругаться), но аппаратура значение переменной может изменить. Т.е. volatile - это переменная, которую можно программно читать и писать (типа порта ввода-вывода), а const volatile - это переменная, которую программно можно только читать (что-то типа таймера)
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 14:33 #9
const и volatile — это ортогональные модификаторы. Они не взаимоисключающие или что-то в этом роде.

const — это просьба компилятору давать вам по голове за попытки написать код, изменяющий эту переменную. Конечно, компилятору можно заткнуть рот с помощью const_cast или хитрым жонглированием указателями, но от этого он и не должен спасать.

volatile — это требование генерировать код так, чтобы побочные эффекты, действующие на эту переменную (например, присваивание ей значения; в частности, чтение volatile-переменной тоже считается побочным эффектом), были завершены и видимы в так называемых sequence points (точках следования). Грубо говоря: чтобы перед и после каждого выражения значение volatile-переменной было определено и неизменно, вне зависимости от того, что там компилятор решит надумать оптимизировать и как эту переменную будут дёргать соседние потоки (или ОС). Между выражениями — может «самопроизвольно» изменяться.
1
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,658
Записей в блоге: 17
13.08.2012, 14:35  [ТС] #10
это НЕ указатель на константу, а указатель, по которому нельзя записывать
Ну так это оно и тоже... покрайней мере... в литературе применяется "указатель на констант" с оговорками что в действительности переменная может не быть константой сама по себе... повышение константности итп...

Ну а константный указатель обычно в литературе это указатель значение которого нельзя изменить ( не обьект)
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 14:42 #11
Поэтому лучше не писать какие-то "константные указатели", которые "обычно понимается так, но кое-где эдак", а писать кодом, который имеет один и тот же смысл всегда:
C++
1
2
3
4
5
/* выражение        допустимые операции */
int *s;              // s = 123; *s = 123;
const int *p;        // s = 123;
int * const q;       // *s = 123;
const int * const r; // никаких присваиваний
1
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,658
Записей в блоге: 17
13.08.2012, 14:44  [ТС] #12
Ну а какую роль volatile играет в объявлении указателя?
Он относится к самому указателю или обьекту?
0
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,527
Записей в блоге: 26
13.08.2012, 14:47 #13
Цитата Сообщение от Avazart Посмотреть сообщение
Читаю тему...
Первая тема была написана по времени намного раньше, чем вторая. И в тот момент у меня ещё не наступило просветления

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так это оно и тоже...
Нет, не одно и то же. Понятие "указатель на константу" означает, что все чтения по этому указателю выдадут один и тот же результат. Но при наличии volatile это не будет верным (т.е. разные чтения по указателю могут дать разный результат). Т.е. понятие "указатель, по которому нельзя записывать" оно более корректное

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ну а какую роль volatile играет в объявлении указателя?
Он относится к самому указателю или обьекту?
Если volatile относится к звёздочке, то относится к памяти, на которую смотрит указатель. Смысл такой, что в коде:

C
volatile int *p;
int x, y;
 
x = *p;
y = *p;
Итоговые значения переменных x и y могут быть различными
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,658
Записей в блоге: 17
13.08.2012, 14:58  [ТС] #14
Ну так они будут стопудово одинаковыми только если p указывает на константу.
C++
1
2
const int a=6;
int *p=&a;
в других случаях с volatile или без они могут отличатся

Или имеется ввиду именно в контексте многопоточности?
0
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,527
Записей в блоге: 26
13.08.2012, 15:03 #15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так они будут стопудово одинаковыми только если p указывает на константу.
volatile-объект по определению не может быть константной

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так они будут стопудово одинаковыми только если p указывает на константу.
Будут. Только всё равно это правильно называть "указатель, по которому нельзя записывать", а не указатель на константу. const-указатель может указывать и не на константу, но в этом случае программист обязан обеспечить, чтобы на время жизни указателя НЕ менялось значение по этому адресу.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
void func1 (int *p)
{
  ....
}
 
void func2 (void)
{
  int x = 5;
 
  func1 (&x);
  x++;
  func2 (&x);
}
в данном примере указатель p (параметр функции func1) НЕ указывает на константу, но за время жизни указателя p значение переменной x (на которую смотрит указатель) не меняется
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 15:03
Привет! Вот еще темы с ответами:

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //<-- ??? } В clang это работает. В VisualStudio 2015 нет.

const& и const* в имени функции - C++
Объясните пожалуйста что значит const& и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template <typename T> ...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,"acc.dll",RT_RCDATA); if(!hRes){ } HGLOBAL...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.08.2012, 15:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru