Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403

Указатели на константные объекты

23.01.2017, 11:40. Показов 3835. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нельзя создать неконстантный указатель на константный объект по понятным причинам, но имеем такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef char* pStr;
 
int main ()
{
  const char ch1 = 'a';
  //char* ptr1 = &ch;        // ошибка!
  const char* ptr2 = &ch1;   // ok
 
 
  char ch2 = 'b';
  const pStr ptr3 = &ch2;
  const pStr* ptr4 = &ptr3;  // ok! wtf???
 
  return 0;
}
в 12 строке создается неконстантный указатель на константный указатель. почему такое допускается?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2017, 11:40
Ответы с готовыми решениями:

Константные указатели и указатели на константу
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...

Константные объекты
#include <iostream> #include <windows.h> using namespace std; class CTest { public: int A,B; CTest(int Aval,int...

Константные методы и объекты класса
Это необходимость, или явная подстраховка того, что бы объект (константный) работал с себе подобными методами класса ?

29
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.01.2017, 14:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JIawliet Посмотреть сообщение
ничего меня не путает, есть четкий вопрос: почему можно создать указатель (без!!! const верхнего и нижнего уровня) на константный (с const верхнего уровня) jобъект????
Константный указатель - это тоже объект.
Объект, который хранит адрес.
Я потому и привел пример выше, что ничем эти примеры не отличаются. Абсолютно идентичны. Абсолютно.
Только в первом случае у нас простой тип, и константа этого простого типа. А во втором - тип составной (указатель), а в остальном все тоже самое.
Поэтому мы можем создать другой адрес, который будет хранит адрес того, первого адреса.
Как только ты перестанешь воспринимать указатель как нечто обособленное от переменной, то сразу все встанет на свои места.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
23.01.2017, 14:25
C++
1
2
const type SZ = 100;
type* ptr = &SZ;   // ERROR!
Да... Попытка создания указателя на неконстантные данные, указывающего на константные данные приведет к ошибке.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.01.2017, 14:27
Цитата Сообщение от JIawliet Посмотреть сообщение
да в том что их нельзя создавать!
C++
1
2
const int SZ = 100;
int* ptr = &SZ;   // ERROR!
Этот пример эквивалентен вот такому твоему первому примеру:
C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef char* pStr;
 
int main ()
{
//..............
 
  char ch2 = 'b';
  const pStr ptr3 = &ch2;
  pStr* ptr4 = &ptr3;  // error (убрал const)
 
  return 0;
}
Однако const в твоем примере присутствует, значит и второй пример должен быть таким:
C++
1
2
const int SZ = 100;
const int* ptr = &SZ;   // OK
Правила одни и те же.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.01.2017, 14:31
Цитата Сообщение от JIawliet Посмотреть сообщение
почему можно создать указатель (без!!! const верхнего и нижнего уровня) на константный (с const верхнего уровня) объект????
Откуда вы взяли эти глупые определения "верхний", "нижний" уровень?

Ещё раз, вы путаете указатель на константу с константным указателем.
Можно спокойно создать неконстантный указатель на константный объект и не важно чем является этот объект - переменной или другим указателем.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.01.2017, 14:34
Попробую по-другому.

Цитата Сообщение от JIawliet Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef char* pStr;
 
const char ch = 'a';
//const pStr ptr = &ch;  // ошибка (aka char* const / aka const верхнего уровня)
 
/*
 *   ptr в свою очередь тоже объект,
 *   как и ch. У ch const верхнего уровня
 *   и у ptr const верхнего уровня
 */
 
// тогда почему допустим такой код????
const pStr ptr = nullptr;
const pStr* pptr = &ptr;    // обычный указатель без const верхнего и нижнего уровня
                            // указывает на константный объект!!!!
const применяется к всему typedef, как к целом типу. Т.е. константным становится сам указатель (а не то, на что он указывает).
Это тебе понятно, я вижу.

Вот теперь смотри, твой код:
C++
1
2
3
4
// тогда почему допустим такой код????
const pStr ptr = nullptr;
const pStr* pptr = &ptr;    // обычный указатель без const верхнего и нижнего уровня
                            // указывает на константный объект!!!!
Берешь и заменяешь pStr на char.
C++
1
2
3
4
// тогда почему допустим такой код????
const char ptr = 0;
const char * pptr = &ptr;    // обычный указатель без const верхнего и нижнего уровня
                             // указывает на константный объект!!!!
Что-нибудь для тебя изменилось?
1
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
23.01.2017, 14:38  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Откуда вы взяли эти глупые определения "верхний", "нижний" уровень?
Липпман (хотя можете все помидоры кидать в локализатора)

Цитата Сообщение от MrGluck Посмотреть сообщение
Ещё раз, вы путаете указатель на константу с константным указателем.
еще раз, я не путаю константный указатель и указатель на константу

Цитата Сообщение от MrGluck Посмотреть сообщение
Можно спокойно создать неконстантный указатель на константный объект
да, указатель будет неконстантным, но он будет указывать на константу (const нижнего уровня)

C++
1
2
char* const ptr1 = nullptr;  // константный указатель
const char* ptr2;            // указатель на константу
я уже не знаю как и писать... хорошо вопрос такой:
C++
1
2
typedef char* pStr;
const pStr* ptr;
у ptr есть const верхнего или нижнего уровня или это обычный указатель без спецификатора const???
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.01.2017, 14:42
Лучший ответ Сообщение было отмечено JIawliet как решение

Решение

Цитата Сообщение от JIawliet Посмотреть сообщение
у ptr есть const верхнего или нижнего уровня или это обычный указатель без спецификатора const???
Есть. Указатель на const - в терминологии книги "нижний уровень".
О чем и писалось на двух страницах до этого.
1
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
23.01.2017, 14:42
В стандарте с++ вроде бы есть top-level const.
Что логично, учитывая, что top-level const имеет особое значение при работе компилятора. Остальные const становятся top-level const по мере раскрытия.

Но в стандарте нет low-level const. Это какие-то педагогические инсинуации ...
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
23.01.2017, 14:56  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Есть. Указатель на const - в терминологии книги "нижний уровень".
ну вот и славно, значит я просто неправильно его интерпретировал. Изначально я говорил (с самого начала поста), что это просто указатель, а это указатель на константу. Вот за это сразу надо было дать подзатыльник и тема была б закрыта

Цитата Сообщение от Mirmik Посмотреть сообщение
Но в стандарте нет low-level const. Это какие-то педагогические инсинуации
это не я придумал
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.01.2017, 15:09
Цитата Сообщение от JIawliet Посмотреть сообщение
Вот за это сразу надо было дать подзатыльник и тема была б закрыта
Ты очень высокого мнения о наших телепатических способностях.
Ты встань на наше место. Человек пишет код, условно говоря
C++
1
const T a = 0;
Создает указатель, пишет перед ним const (даже тему называет "указатель на const-объекты"):
C++
1
const T * pA = &a;
А потом ошарашивает вопросом, а какого черта это компилируется?
Да еще со столькими эмоциями, что прям захотелось "подзатыльник" (с) дать, чтоб успокоился
Тут, понимаешь ли, два выхода: либо считать тебя троллем (чего никто тут делать не стал, а это дорогого стоит), либо посчитать, что что-то не так в твоем понимании темы "указатели".

Тем не менее, я тебе несколько раз намекал на то, что const ты не туда относишь - посмотри мои ответы выше, только без эмоций. Намек, что под T может быть любой тип (в том числе и сложносоставленный через typedef) и правила от этого не поменяются.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2017, 15:09
Помогаю со студенческими работами здесь

Константные статические объекты класса.
Здравствуйте. Есть класс "матрица" нужно задать константные матрицы такие как E - единичная матрица и т.д., как это сделать? #include...

Константные указатели в качестве аргументов функций
Вскрылся вот такой пробел в знаниях/понимании. Итак, есть предположим однонаправленный список (в общем без разницы что). struct TNode {...

Константный указатель на константные данные (указатели)
В общем если раскомментить const то ничего не работает может кто знает как правильно передавать константный указатель на константные...

Как правильно объявлять статические константные объекты в классе?
В классе надо объявить статичные константные строки. Типа class A { public: static const std::string OLOLO = "ololo"; ...

Константные и не константные ссылки. Приведения типов. Нужно уточнение
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &y = x; const double &y = x; Почему для не...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru