Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510

Итерация константного указателя

16.09.2024, 20:17. Показов 986. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
C++
1
2
3
4
5
6
7
8
9
10
11
12
int arr[3] = { 1,2,3 };
 
void testr(const int *ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
 
int main()
{   
    testr(&arr[0]);
}
выполняется отлично.
вопрос почему ?
или здесь типа ну мы же разыменовываем указатель, и все равно это копия указателя?
передаю константный указатель на нечто, и итерирую его.
но он же константный.
как это возможно ?

Добавлено через 1 минуту
тут ругается
C++
1
2
3
4
5
void testr2(const int ptr)
{
    for (int i = 0; i < 3; i++)
        cout << ptr++ << endl;
}
все норм
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2024, 20:17
Ответы с готовыми решениями:

В чём отличие константного указателя и указателя на константу?
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Возвращение неконстантного указателя из константного указателя на строку
Не могу до конца понять один момент. Допустим, у нас есть функция searchSymbol, которая принимает два параметра: константный указатель на...

в чем смысл константного указателя на коллекцию (в классе итератора)
Привет. Прошу подскажите, я чего-то не улавливаю. Наткнулся на пример реализации класса итератора: ... class Stack { int...

12
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
16.09.2024, 20:20
Лучший ответ Сообщение было отмечено pup_kin как решение

Решение

Цитата Сообщение от pup_kin Посмотреть сообщение
вопрос почему ?
Это указатель на константные данные.

C++
1
2
3
4
5
6
// изменяемые данные
int* ptr;
// Константный указатель, изменяемые данные
int* const ptr;
// Константный указатель на неизменяемые данные
const int * const ptr;
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
16.09.2024, 23:20  [ТС]
все понятно тему можно удалить
же и передают константный указатель, а то что он итерируется - это уже дело десятое, итерируется то не он, его же по сути и нет вовсе.

Добавлено через 1 минуту
да, это указатель на константные данные - верно.
не указатель коснтантный, а данные константные.
спс

Добавлено через 2 часа 55 минут
а вот это тогда что такое?
C++
1
2
3
4
5
void testr(const int const *&ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
по поведению указатель неконстантный.

Добавлено через 1 минуту
а тут норм - ругается
C++
1
2
3
4
5
void testr(const int const &ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
а выше , получается константная ссылка на указатель.
а можно вот так?

Добавлено через 54 секунды
C++
1
void testr(const int const & const *ptr)
?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
17.09.2024, 01:38
Цитата Сообщение от pup_kin Посмотреть сообщение
передают константный указатель, а то что он итерируется - это уже дело десятое, итерируется то не он, его же по сути и нет вовсе.
Что за чушь тут написана?

Цитата Сообщение от pup_kin Посмотреть сообщение
а вот это тогда что такое?
C++
1
2
3
4
5
void testr(const int const *&ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
по поведению указатель неконстантный.
Чего? По какому еще "поведению"? Код невозможно скомпилировать. О каком "поведении" может идти речь?

Цитата Сообщение от pup_kin Посмотреть сообщение
а тут норм - ругается
C++
1
2
3
4
5
void testr(const int const &ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
Ругается точно так же, как и на предыдущий код. О чем речь?

Цитата Сообщение от pup_kin Посмотреть сообщение
C++
1
void testr(const int const & const *ptr)
?
И на это ругается точно так же, как и на предыдущий код. Везде одна и та же ошибка. О чем речь вообще?
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
17.09.2024, 14:22  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Код невозможно скомпилировать.
прекрасно можно скомпилировать .
я ж поэтому и вопрошаю, что на мой взгляд тоже гавно какое-то но прекрасно работает

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void testr(const int const *&ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
 
 
int main()
{   
    const int* ptr = &arr[0];
 
    testr(ptr);
}
да и так работает
C++
1
2
3
4
5
void testr(const int const *ptr)
{
    for (int i = 0; i < 3; i++)
        cout << *ptr++<< endl;
}
ну хотя верно
то что так работает
void testr(const int const *ptr) это еще понятно
это же копия указателся
но как он оне валится когда
void testr(const int const *&ptr).
пишу в visual studio
Microsoft Visual Studio Community 2019
Версия 16.11.20
стандарт 17
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.09.2024, 14:49
Цитата Сообщение от pup_kin Посмотреть сообщение
Microsoft Visual Studio Community 2019
поставь флаг /Wall /WX и всё увидишь.
Он просто игнорирует второй const, втихаря.
Потому что он стоит не там где нужно.

Добавлено через 4 минуты
И дам тебе совет, тот стиль что обычно пишут, он не совсем такой каким задумывался. Это проблема ипучих тайпдефов и стилистики.

На самом деле, типы читаются справа на лево.
C++
1
int const * const * somevariable;
Читается как : somevariable - указатель на константный указатель на константный int

Совет номер два, пока разбираешься с квалификаторами типа const, оставь ссылки в покое.
Ими займешься позже.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
17.09.2024, 19:22  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
И дам тебе совет, тот стиль что обычно пишут, он не совсем такой каким задумывался. Это проблема ипучих тайпдефов и стилистики.
не совсем понял

Добавлено через 2 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
На самом деле, типы читаются справа на лево.
это у Павловской в книжке есть
а бывают исключения?
п.с.столько лет валялась книжка, я даже не думал- что это кладезь, такое золото - неограненный алмаз.
по 1с тонна макулатуры с картинками для даунов
а тут серенькая книженция по с++
по паскалю делфям помню были толстые талмуды,
а тут "пшик" какой-то, но на вес золота.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.09.2024, 19:53
Цитата Сообщение от SmallEvil Посмотреть сообщение
И дам тебе совет, тот стиль что обычно пишут, он не совсем такой каким задумывался. Это проблема ипучих тайпдефов и стилистики.
Цитата Сообщение от pup_kin Посмотреть сообщение
не совсем понял
Уже точно не помню.
Там про typdef было. И что в них, место квалификатора (например const) имеет какой то иной порядок/место.
То есть. Используем using и классическую для С++ форму записи : сначала тип - потом квалификатор.
И путаницы не будет.

C++
1
2
3
4
const int -> int const // константный инт
const &int -> int const & // ссылка на константный инт
const int * -> int const * // указатель на константный инт
const int * const - >  int const * const // константный указатель на константный инт
Добавлено через 1 минуту
p.s. старые программисты, уже привыкли к старому стилю и форме записи
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
17.09.2024, 22:54  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
p.s. старые программисты, уже привыкли к старому стилю и форме записи
а для чего так сделали?
я порой тоже читаю программу чужую и понять не могу, слова знакомые , а складываются в непойми чего.

т.е если писать
тип квалификатор то будет 100% норм
и это работает и со static.
т.е можно написать
C++
1
2
3
int const * const ptr2 = &y;
const  int * const ptr2 = &y;
int const  const *ptr2 = &y;
чета как-то я ожидал меньшего свободоизъявления от строго типизированного языка.

Добавлено через 2 минуты
а почему такая чехорда?
это разные диалекты кантонский Си и пр.,
или исторически сложилось , или компиляторы разные?
верно ли я понимаю что без разницы какой порядок
тип квалификатора и пр.

можно ли меняя местами
тип квалификатор и значок укаателя( это тоже часть типа)
описать другую сущность?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.09.2024, 23:25
Цитата Сообщение от pup_kin Посмотреть сообщение
верно ли я понимаю что без разницы какой порядок
есть разница, но первый, он же нижний, допускается как перед типом так и за ним, я же демонстрировал в посте 8.

Добавлено через 7 минут
Цитата Сообщение от pup_kin Посмотреть сообщение
т.е можно написать
Цитата Сообщение от pup_kin Посмотреть сообщение
int const  const *ptr2 = &y;
Вот так уже нельзя, один конст повторяется дважды, что не имеет смысла.

Добавлено через 1 минуту
Есть одна человеческая причина по которой первый квалификатор пишут первым.
Это читаемость. Вот и всё.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
18.09.2024, 00:10
Цитата Сообщение от pup_kin Посмотреть сообщение
прекрасно можно скомпилировать .
я ж поэтому и вопрошаю, что на мой взгляд тоже гавно какое-то но прекрасно работает
Это не более чем дыры в системе диагностики вашего компилятора. В С++, в отличие от С, не разрешаются явные избыточные повторения одного и тот же квалификатора. В вашем случае - избыточное повторение const не допускается в С++.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.09.2024, 00:35
Цитата Сообщение от pup_kin Посмотреть сообщение
т.е можно написать
C++
1
int const * const ptr2 = &y;
На практике, так никто не пишет. Разве что на С-ях

Я бы написал так :

C++
1
using pc_int = int const *;
Тогда, где то в классе :
C++
1
void foo (const pc_int ptr)
Распространенные типы, зачастую, выноситься отдельно, в файл, в неймспейс и т.д.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
18.09.2024, 00:43
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я бы написал так :

C++
1
using pc_int = int const *;
Сокрытие указательного типа за псевдонимом - странная (многие скажут: дурная) практика.

Сокрытие указательного типа за псевдонимом допустимо если вы действительно хотите сделать "указательность" типа скрытой деталью реализации, которую клиентскому коду знать не нужно.

Если же клиентский код должен знать, что это указатель, то звездочку лучше держать на виду, а не прятать внутри псевдонима.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2024, 00:43
Помогаю со студенческими работами здесь

Как избежать дублирования кода при написании константного и не константного метода?
Есть класс Buffer, который содержит метод forBounds, который в качестве параметров принимает вспомогательный класс Bounds и шаблонный...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; class B{ public:

Как из неизменяемого указателя – имя массива и смещения указателя заполнить массив случайными числами
Как с помощью неизменяемого указателя – имя массива и смещения указателя заполнить массив случайными числами и вывести на экран матрицу в...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru