Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
#1

Что означает запись (struct addr *)&one - C++

10.07.2015, 14:36. Просмотров 357. Ответов 13
Метки нет (Все метки)

Что означает тринадцатая строчка в коде?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main() 
{
    struct addr
    {
        int a;
    };
 
    struct addr one;
    one.a = 865;
 
    (struct addr *)&one;
    
    system("pause");
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2015, 14:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что означает запись (struct addr *)&one (C++):

Непонятный указатель: что означает запись (IEngineSubSystem *&)p_render ? - C++
Здравствуйте. Вот код: IRender *p_render; pEngineCore-&gt;GetSubSystem(ESS_RENDER,(IEngineSubSystem *&amp;)p_render); Там еще, короче,...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Что означает слово struct внутри объявления структуры? - C++
Допустим объявляю структуру следующим образом: struct element{ int id; struct element* next; }; Что означает в данном...

Что означает *& - C++
Искал я информацию про деревья в с++, нашёл информацию в http://ci-plus-plus-snachala.ru/?p=1249 но там используется *&amp;, что мне не...

Что означает сочетание *& - C++
например здесь: struct Node //Звено дерева { int x; //То, что записываем в дерево Node *l,*r; //Это указатели на новые...

Что означает node*& ? - C++
void del_all(node*&amp; r) //удаление всех узлов { if (!r) return; del_all(r-&gt;left); del_all(r-&gt;right); delete r; r = NULL; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 16:33 #2
Цитата Сообщение от proont Посмотреть сообщение
Что означает тринадцатая строчка в коде?
берем адрес переменной one, которая имеет тип addr.
и приводим его к типу addr*

а потом ничего с этим больше не делаем.

и таким образом, 13 строчка абсолютно бесполезная.
если её удалить, ничего не изменится.
1
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
10.07.2015, 19:28  [ТС] #3
Цитата Сообщение от hoggy Посмотреть сообщение
берем адрес переменной one, которая имеет тип addr.
и приводим его к типу addr*
А изначально у &one не такой же тип будет как у addr*?
0
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 19:51 #4
Цитата Сообщение от proont Посмотреть сообщение
А изначально у &one не такой же тип будет как у addr*?
такой же.

это бессмысленная запись.
1
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
10.07.2015, 20:16  [ТС] #5
hoggy, мне нужно разобраться, что в таком случае произойдет при преобразовании указателя?

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
#include <iostream>
using namespace std;
 
int main()
{
    
    struct sockaddr {
        unsigned short    sa_family;    
        char              sa_data[14];  
    };
 
    struct in_addr {
        unsigned long s_addr;
    };
 
    struct sockaddr_in {
        short int          sin_family;  
        unsigned short int sin_port;    
        struct in_addr     sin_addr;    
        unsigned char      sin_zero[8]; 
    };
 
    struct sockaddr_in ADDR;
 
    (struct sockaddr *)&ADDR; // указатель на структуру sockaddr_in приводится к указателю на sockaddr
 
 
 
    return 0;
}
0
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 20:24 #6
Цитата Сообщение от proont Посмотреть сообщение
что в таком случае произойдет при преобразовании указателя?
будет создан новый указатель
(вашем случае - временный объект).
это будет указатель sockaddr *, но он будет указывать на область памяти,
где по факту был создан sockaddr_in

далее компилятор пофиксит,
что никому этот временный объект не нужен,
потому что он никак не используется.
и оптимизирует его.
1
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
10.07.2015, 20:47  [ТС] #7
Цитата Сообщение от hoggy Посмотреть сообщение
далее компилятор пофиксит,
что никому этот временный объект не нужен,
потому что он никак не используется.
и оптимизирует его.
Ну это само собой понятно.

Цитата Сообщение от hoggy Посмотреть сообщение
будет создан новый указатель
(вашем случае - временный объект).
это будет указатель sockaddr *, но он будет указывать на область памяти,
где по факту был создан sockaddr_in
А при преобразовании данные потеряются? И можно ли этому найти применение какое-нибудь?
0
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 20:52 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от proont Посмотреть сообщение
А при преобразовании данные потеряются?
интерпритируются.

объект - это просто кусок памяти.

содержимое объекта определяется типом имени,
через которое осуществляется доступ к нему.

таким образом, независимо от того,
что по факту там объект типа sockaddr_in ,

но при доступе к объекту через указатель sockaddr *,
компилятор будет считать, что там sockaddr

в случае с сокетами беркли это прокатывает.

в каких то других случаях может не прокатить.

здесь нужно смотреть по ситуации.
1
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
10.07.2015, 20:57  [ТС] #9
Цитата Сообщение от hoggy Посмотреть сообщение
в случае с сокетами беркли это прокатывает.
Я разбираюсь с сокетами Беркли и там это нашел.
И не понимаю для чего так сделано и что происходит при этом.
0
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 21:00 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от proont Посмотреть сообщение
можно ли этому найти применение какое-нибудь?
ну например, такое используют всякого рода врапперы ресурсов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct some{ .. };
 
char buf[ sizeof(some)  ]; //<--- хранилище байтов
// объект - это ведь просто кусок памяти
// кучка байтов
 
 
new (buf) some; //<--- создаем объект, в хранилище
 
// по факту мы имеем только массив байт.
// но содержимое этих байт - это объект типа some
 
some* pObj = (some*)buf; // <--- теперь мы сообщаем, 
// что эта кучка байт на самом деле наш объект
 
// и таким образом получаем доступ к объекту,
// который по такой схеме можно аллоцировать куда угодно
Добавлено через 1 минуту
Цитата Сообщение от proont Посмотреть сообщение
И не понимаю для чего так сделано и что происходит при этом.
а вам и не нужно понимать, это их кухня.
они могут вертеть объектами, как захотят.

главное,что это работает.
и вы можете поиметь свой профит.
1
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
10.07.2015, 21:01  [ТС] #11
Цитата Сообщение от hoggy Посмотреть сообщение
содержимое объекта определяется типом имени,
через которое осуществляется доступ к нему.
C++
1
2
struct addr {...};
struct addr one;
one это имя, а addr тип?
0
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 21:06 #12
Цитата Сообщение от proont Посмотреть сообщение
one это имя, а addr тип?
ага
1
proont
1 / 1 / 1
Регистрация: 15.11.2014
Сообщений: 79
10.07.2015, 21:23  [ТС] #13
Цитата Сообщение от hoggy Посмотреть сообщение
new (buf) some;
погуглил и открыл для себя placement new.
Получается, что с помощью placement new мы создаем объект some в уже в выделенной памяти для buf?
0
hoggy
Нарушитель
6563 / 2744 / 474
Регистрация: 15.11.2014
Сообщений: 6,084
Завершенные тесты: 1
10.07.2015, 21:29 #14
Цитата Сообщение от proont Посмотреть сообщение
Получается, что с помощью placement new мы создаем объект some в уже в выделенной памяти для buf?
ага.
мы указываем адрес, где расположить объект.
а то там за память - вопрос отдельный.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 21:29
Привет! Вот еще темы с ответами:

Что означает данное условие? if (i & (1 << j) - C++
Можете объянить простым алгоритмическим языком что данное условие означает? if (i &amp; (1 &lt;&lt; j))

Что означает знак & в объявлении функции - C++
Здравствуйте, в обучающих статьях о С++ наткнулся на очень интересную синтаксическую конструкцию. Не совсем разобрался с указателями и...

что означает данная строчка? &operator - C++
что это означает? (Tabl это класс) friend ofstream &amp;operator &lt;&lt; ( ofstream &amp;outf, Tabl MyTabl ) я так понимаю объявляется...

Что означает строка: CString &ptr = Text; ? - C++
Помогите please! Что означает строка: CString &amp;ptr = Text; Text определена выше, как: CString Text;


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2015, 21:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru