Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12

Константный указатель на константные данные (указатели)

12.05.2015, 20:18. Показов 3184. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем если раскомментить const то ничего не работает
может кто знает как правильно передавать константный указатель на константные данные когда ими являются указатели
за ранее спасибо и низкий поклон.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>      
#include <iomanip>       
#include <stdlib.h>
#include <time.h>
using namespace std;                                        //очевидно что я зря вставил весь код
void shaffle(int [][13]);                                   //интерес представляют только:
void deal(const int [][13], /*const*/ char  *[], /*const*/ char *[]);    // ЭТО
 
int main(){
    
    char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики"};
    char *face[13] = {"Туз", "Двойка", "Тройка","Четверка", "Пятерка",
                   "Шестерка","Семерка","Восьмерка","Девяка",
                    "Десятка", "Валет", "Дама","Король"};
    int deck[4][13] = {0};
    srand(time(0));
    
    shaffle(deck);
    deal(deck, face, suit);         // ЭТО
    return 0;
        
    }
 
void shaffle(int wDeck[][13]){
    int row, column;
    
    for (int card = 1; card <= 52; card++) {
        
        row = rand() % 4;
        column = rand() % 13;
        
        while (wDeck[row][column] != 0) {                    
            row = rand() % 4;                                          
            column = rand() % 13;                               
        }
        wDeck[row][column] = card;
    }
    
}
 
void deal(const int wDeck[][13], /*const*/ char  *wFace[], /*const*/ char *wSuit[]){        // И ЭТО
    for (int card = 1; card <= 52; card++)
        for (int row = 0; row <= 3; row++)
            for (int column = 0; column <= 12; column++)
                if (wDeck[row][column] == card)
                    cout << setw(9) << setiosflags(ios::right)
                    << wFace[column] << " Масти "<< setw(5) << setiosflags(ios::left)
                    << wSuit[row]
                    <<(card % 2 == 0 ? '\n' : '\t');
                
            
        
    
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2015, 20:18
Ответы с готовыми решениями:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это можно использовать??

Константный указатель или указатель на константу?
Привет всем.Уважаемые программисты пожалуйста скажите чем отличать когда написано например int const* a='3' -то const касается на указатель...

Как записать константный указатель на указатель
Добрый вечер. Вот данная запись говорит. Указатель на константный указатель типа Int. int * const * a; как записать? ...

14
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
12.05.2015, 20:33
Цитата Сообщение от kryagin Посмотреть сообщение
константный указатель на константные данные
C++
1
void deal(const int arr[][13], const char* const arr1[], const char* const arr2[])
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
12.05.2015, 20:35
Цитата Сообщение от kryagin Посмотреть сообщение
может кто знает как правильно передавать константный указатель на константные данные когда ими являются указатели
C++
1
const char* const p; // константный указатель на константный char
Признаком константности указателя (т.е. его не получится сдвигать) служит второй const. Первый — это const char.
0
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12
12.05.2015, 20:40  [ТС]
тут мне видимо надо уточнить меня интересует именно константность данных, константность указателя обеспечивается уже тем что объявлен массив
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
12.05.2015, 20:43
Цитата Сообщение от kryagin Посмотреть сообщение
не будет ли масло масленым?
Не будет.

Добавлено через 2 минуты
Цитата Сообщение от kryagin Посмотреть сообщение
тут мне видимо надо уточнить меня интересует именно константность данных,
C++
1
void deal(const int [][13], const char* [], const char*[]);
0
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12
12.05.2015, 20:49  [ТС]
lss, mymedia, просто раскоментите const и попытайтесь запустить, я не знаю что с этим делать
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
12.05.2015, 20:54
Лучший ответ Сообщение было отмечено kryagin как решение

Решение

Так будут указатели на константный char (значения по этим указателям нельзя будет менять), но сами указатели не буду констаннтыми (им можно будет присваивать дтугие значения):
C++
1
void deal(const int [][13], const char* [], const char*[]);
Так будут и данные по указателям константными, и сами указатели константными:
C++
1
void deal(const int arr[][13], const char* const arr1[], const char* const arr2[])
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>      
#include <iomanip>       
#include <stdlib.h>
#include <time.h>
using namespace std;                                        //очевидно что я зря вставил весь код
void shaffle(int [][13]);                                   //интерес представляют только:
void deal(const int [][13], const char* const[], const char* const[]);    // ЭТО
 
int main(){
    
    const char * const suit[4] = {"Черви", "Бубны", "Трефы", "Пики"};
    const char * const face[13] = {"Туз", "Двойка", "Тройка","Четверка", "Пятерка",
                   "Шестерка","Семерка","Восьмерка","Девяка",
                    "Десятка", "Валет", "Дама","Король"};
    int deck[4][13] = {0};
    srand(time(0));
    
    shaffle(deck);
    deal(deck, face, suit);         // ЭТО
    return 0;
        
    }
 
void shaffle(int wDeck[][13]){
    int row, column;
    
    for (int card = 1; card <= 52; card++) {
        
        row = rand() % 4;
        column = rand() % 13;
        
        while (wDeck[row][column] != 0) {                    
            row = rand() % 4;                                          
            column = rand() % 13;                               
        }
        wDeck[row][column] = card;
    }
    
}
 
void deal(const int wDeck[][13], const char* const  wFace[], const char* const wSuit[]){        // И ЭТО
    for (int card = 1; card <= 52; card++)
        for (int row = 0; row <= 3; row++)
            for (int column = 0; column <= 12; column++)
                if (wDeck[row][column] == card)
                    cout << setw(9) << setiosflags(ios::right)
                    << wFace[column] << " Масти "<< setw(5) << setiosflags(ios::left)
                    << wSuit[row]
                    <<(card % 2 == 0 ? '\n' : '\t');
}
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
12.05.2015, 21:01
kryagin, у вас на 11 и 12 строчке было некорректное присваивание строковых литералов, которые имеют тип const char*, переменной типа char*. Затем, когда вы на 19 строчке вызывали функцию deal, вы ей передавали массив указателей на char, а не на const char
0
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12
12.05.2015, 21:10  [ТС]
lss, и как теперь верить книгам? "Имя массива - можно понимать как константный указатель"
но кстати первый вариант у меня так и не заиграл и именно он меня и интересует, но все равно спасибо за участие
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
12.05.2015, 21:12
{"Черви", "Бубны", "Трефы", "Пики"};
это всё константы. Не удивительно, попытки объявить их неконстантами вызовут проблемы, что неудивительно!
0
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12
12.05.2015, 21:21  [ТС]
mymedia, боюсь я не достаточно знаю, для того что бы в полной мере принять то что вы мне написали
видимо Дейтел и Дейтел опять меня троллят, зато теперь мне ясно, что ответ лежит вне плоскости моих знаний. Спасибо.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
12.05.2015, 21:22
Цитата Сообщение от kryagin Посмотреть сообщение
и как теперь верить книгам? "Имя массива - можно понимать как константный указатель"
Понимать о чём речь. Тут речь идёт об имени массива, которому не присвоить другое значение (адрес), но не о содержимом массива.
0
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12
12.05.2015, 21:22  [ТС]
Kuzia domovenok, по умолчанию все запускается не смотря на то что они не объявлены константами
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
12.05.2015, 21:29
Лучший ответ Сообщение было отмечено kryagin как решение

Решение

kryagin, не следует путать массив и константный указатель. Дело в том, что в большинстве случаев имя массива может неявно преобразовываться к константному указателю. Однако есть такие контексты, где такого преобразования не происходит. Например в операторе sizeof. Благодаря этому возможен такой хак, чтобы узнать количество элементов в массиве
C++
1
const size_t n = sizeof(array) / sizeof(*array)
Вот, например, в первом операторе sizeof неявного преобразования имени массива в указатель не происходит.
Также в структурах массив != указатель.
Если вы ещё только изучаете C++, хотелось бы предостеречь вас от такой путаницы — мне она в своё время очень сильно мешала

Добавлено через 4 минуты
Цитата Сообщение от kryagin Посмотреть сообщение
Kuzia domovenok, по умолчанию все запускается не смотря на то что они не объявлены константами
Конечно, всё запускается, однако, компилятор выдаёт предупреждения о том, что происходит опасное преобразование. Например, мне компилятор выдал следующее на ваш первый пример (после раскоментирования const)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
user@netbook:~$ g++ tmp.cpp 
tmp.cpp: В функции «int main()»:
tmp.cpp:11:74: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
     char *suit[4] = {"Черви", "Бубны", "Трефы", "Пики"};
                                                                          ^
tmp.cpp:11:74: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:11:74: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:11:74: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
                     "Десятка", "Валет", "Дама","Король"};
                                                                              ^
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:14:78: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
tmp.cpp:19:26: ошибка: некорректное преобразование из «char**» в «const char**» [-fpermissive]
     deal(deck, face, suit);         // ЭТО
                          ^
tmp.cpp:7:6: ошибка:   при инициализации 2 -го аргумента «void deal(const int (*)[13], const char**, const char**)» [-fpermissive]
 void deal(const int [][13], const char *[], const char *[]);    // ЭТО
      ^
tmp.cpp:19:26: ошибка: некорректное преобразование из «char**» в «const char**» [-fpermissive]
     deal(deck, face, suit);         // ЭТО
                          ^
tmp.cpp:7:6: ошибка:   при инициализации 3 -го аргумента «void deal(const int (*)[13], const char**, const char**)» [-fpermissive]
 void deal(const int [][13], const char *[], const char *[]);    // ЭТО
      ^
Настройте свой компиятор так же, чтобы он почаще выдавал предупреждения
1
1 / 1 / 0
Регистрация: 06.05.2015
Сообщений: 12
12.05.2015, 21:38  [ТС]
mymedia, он на меня и так орет. это пример из учебника, который у авторов вроде как работает, а у меня не очень..

Добавлено через 4 минуты
Всем большое спасибо вытру сопли и пойду учить дальше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2015, 21:38
Помогаю со студенческими работами здесь

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

Указатели на константные объекты
Нельзя создать неконстантный указатель на константный объект по понятным причинам, но имеем такой код: typedef char* pStr; int...

Константный указатель
Для записи через * T * const name; Для записи через ???

Константный указатель
Почему в данном примере константный указатель может быть использован для вывода элементов вектора? #include &lt;iostream&gt; ...

Константный указатель
Здравствуйте! Имею класс - MyClass. Константный указатель на него: const MyClass *pMyClass; Но в программе я присваиваю далее...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru