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

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

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

Author24 — интернет-сервис помощи студентам
У меня не получается выполнить приведение указателя базового типа. Я, и 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2016, 12:00
Ответы с готовыми решениями:

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

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

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

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

23
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
15.08.2016, 13:16  [ТС] 21
Author24 — интернет-сервис помощи студентам
Так, а мне-то на моём примере как лучше скастить указатель или лучше его вообще не кастить, а просто указатель ptrb указать на &b, или как. На моём примере.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.08.2016, 13:27 22
Цитата Сообщение от kokzahvas Посмотреть сообщение
Так, а мне-то на моём примере как лучше скастить указатель или лучше его вообще не кастить, а просто указатель ptrb указать на &b, или как. На моём примере.
На твоем примере не понятно чего добиться нужно.
Ты можешь вполне безопасно скастить short * в char *, и посмотреть отдельные байты числа. Если short* кастить к int* на платформе, где int больше, чем short, то это приведет к UB, как я выше уже объяснил. Так что скажи что требуется (только не надо говорить "требуется скастить" - ведь когда мы говорим надо забить гвоздь, мы подразумеваем для чего: например, чтобы повесить картину. так и тут, касты без причины не делают).
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
15.08.2016, 13:57  [ТС] 23
Цитата Сообщение от 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
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.08.2016, 15:18 24
Лучший ответ Сообщение было отмечено 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
15.08.2016, 15:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2016, 15:18
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru