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

Приведение указателя базового типа

14.08.2016, 12:00. Показов 4643. Ответов 23

Студворк — интернет-сервис помощи студентам
У меня не получается выполнить приведение указателя базового типа. Я, и static_cast пробовал, и dynamic_cast пробовал, но компилятор всё равно выводит сообщение, что ptra - это не указатель.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
int main(int argc, char **argv)
    {
        short a = 96;
        short *ptra = &a;
        int b = static_cast<int>(a);
        int *ptrb = static_cast<int>(ptra);
        return 0;
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2016, 12:00
Ответы с готовыми решениями:

Приведение типа указателя
Здравствуйте, у меня такой вопрос: как организовать приведение типа указателя к другому? Есть указатель string *ptr; на поле класса, нужно...

Приведение типа указателя на метод
Здравствуйте. Есть функция, принимающая void (*f)(), возможно ли использовать ее в классе, передавая ей не-static метод этого класса? ...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

23
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
15.08.2016, 13:16  [ТС]
Студворк — интернет-сервис помощи студентам
Так, а мне-то на моём примере как лучше скастить указатель или лучше его вообще не кастить, а просто указатель ptrb указать на &b, или как. На моём примере.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
15.08.2016, 13:27
Цитата Сообщение от kokzahvas Посмотреть сообщение
Так, а мне-то на моём примере как лучше скастить указатель или лучше его вообще не кастить, а просто указатель ptrb указать на &b, или как. На моём примере.
На твоем примере не понятно чего добиться нужно.
Ты можешь вполне безопасно скастить short * в char *, и посмотреть отдельные байты числа. Если short* кастить к int* на платформе, где int больше, чем short, то это приведет к UB, как я выше уже объяснил. Так что скажи что требуется (только не надо говорить "требуется скастить" - ведь когда мы говорим надо забить гвоздь, мы подразумеваем для чего: например, чтобы повесить картину. так и тут, касты без причины не делают).
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
15.08.2016, 13:57  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
На твоем примере не понятно чего добиться нужно.
Ты можешь вполне безопасно скастить short * в char *, и посмотреть отдельные байты числа. Если short* кастить к int* на платформе, где int больше, чем short, то это приведет к UB, как я выше уже объяснил. Так что скажи что требуется (только не надо говорить "требуется скастить" - ведь когда мы говорим надо забить гвоздь, мы подразумеваем для чего: например, чтобы повесить картину. так и тут, касты без причины не делают).
Как это не странно, но мне надо скастить именно без особой причины. Просто я только начал изучать базовый курс C++ и я сейчас просто составляю конспекты, как и что кастять. У меня уже есть конспект «type convertion».
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
int main(int argc, char **argv)
    {
        char a = 96;
        short b = static_cast<short>(a);
        int c = static_cast<int>(b);
        long long d = static_cast<long long>(c);
        float e = static_cast<float>(d);
        long long f = 1234567890123456789;
        long g = static_cast<long>(f);
        short h = static_cast<short>(g);
        float i = 3.1415;
        int j = static_cast<int>(i);
        return 0;
    }
Но в нём описаны простые переменные, которые почему-то приводятся только через static_cast. Не знаю почему, но это OFFTOP. Главное мне надо составить подобный конспект, но про указатели. У меня есть черновик конспекта.
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
#include <iostream>
int main(int argc, char **argv)
    {
        char a = 96;
        char *ptra = &a;
        short b = static_cast<short>(a);
        short *ptrb = reinterpret_cast<short*>(ptra);
        int c = static_cast<int>(b);
        int *ptrc = reinterpret_cast<int*>(ptrb);
        long long d = static_cast<long long>(c);
        long long *ptrd = reinterpret_cast<long long*>(ptrc);
        float e = static_cast<float>(d);
        float *ptre = reinterpret_cast<float*>(ptrd);
        long long f = 1234567890123456789;
        long long *ptrf = &f;
        long g = static_cast<long>(f);
        long *ptrg = reinterpret_cast<long*>(ptrf);
        short h = static_cast<short>(g);
        short *ptrh = reinterpret_cast<short*>(ptrg);
        float i = 3.1415;
        float *ptri = &i;
        int j = static_cast<int>(i);
        float *ptrj = reinterpret_cast<float*>(ptri);
        return 0;
    }
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
15.08.2016, 15:18
Лучший ответ Сообщение было отмечено kokzahvas как решение

Решение

Цитата Сообщение от kokzahvas Посмотреть сообщение
Главное мне надо составить подобный конспект, но про указатели.
Лично я думаю, что от подобных конспектов нет толку. Лучше законспектировать свойства различных преобразований. Т.е. конспекты должны быть не по конкретным примерам преобразований, а по их типам. Примерно в такой структуре:
* static_cast - его свойства (что делает, когда применяется), пример;
* reinterpret_cast - его свойства (что делает, когда применяется), пример;
* dynamic_cast - его свойства (что делает, когда применяется), пример;
* const_cast - его свойства (что делает, когда применяется), пример;
* c-style преобразование - его свойства, примеры.

А то если судить по твоим конспектам, то через static_cast нельзя преобразовать указатели. Но на самом деле можно, просто для этого должны быть соблюдены условия. Например каст в void * и обратно, это именно static_cast. Указатели в пределах иерархии классов также могут быть приведены через static_cast. У тебя этого нет в конспектах. Вот я и предлагаю тебе конспектировать эти условия, а не примеры кастов. Толку будет больше.

Впрочем вот тебе пара комментариев по твоему наброску:
Кликните здесь для просмотра всего текста
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
#include <iostream>
int main(int argc, char **argv)
    {
        char a = 96;
        char *ptra = &a;
        short b = static_cast<short>(a);
        short *ptrb = reinterpret_cast<short*>(ptra); // UB при попытке чтения значения по указателю
        int c = static_cast<int>(b);
        int *ptrc = reinterpret_cast<int*>(ptrb); // UB при попытке чтения значения по указателю
        long long d = static_cast<long long>(c);
        long long *ptrd = reinterpret_cast<long long*>(ptrc); // UB при попытке чтения значения по указателю
        float e = static_cast<float>(d);
        float *ptre = reinterpret_cast<float*>(ptrd); // UB при попытке чтения значения по указателю
        long long f = 1234567890123456789;
        long long *ptrf = &f;
        long g = static_cast<long>(f);
        long *ptrg = reinterpret_cast<long*>(ptrf); // OK, прочитается часть числа f (пример - первые 4 байта из 8)
        short h = static_cast<short>(g);
        short *ptrh = reinterpret_cast<short*>(ptrg); // OK, прочитается часть числа f (пример - первые 2 байта из 8)
        float i = 3.1415;
        float *ptri = &i;
        int j = static_cast<int>(i);
        float *ptrj = reinterpret_cast<float*>(ptri);
        return 0;
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2016, 15:18
Помогаю со студенческими работами здесь

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include &lt;iostream&gt; class Base { public: virtual void f() { std::cout &lt;&lt; &quot;Base\n&quot;; } ...

Приведение указателя на функцию
Здравствуйте, у меня простейший вопрос, но самому не догнать что-то... В качестве аргумента некой функции используется указатель на...

Приведение void* указателя к типу
struct tParamStruct { const char* Result; }; tParamStruct ParamStruct; void show(void *AdressPS) { // ????????

Приведение void* к типу указателя на структуру
Тема обсуждалась здесь, но решения так и нет нормального Есть два (и более, хоть до 20) линейных списков и функция обхода списка В...

Приведение указателя на void к другому типу?
в поиске смотрел - не помогло! Возникла проблемка: В книге сказано, что указателю на void можно присваивать все типы указателей без...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru