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

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

14.08.2016, 12:00. Показов 4741. Ответов 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru