Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструкция, где идет * и затем сразу & 
:(
    Опции темы
Robix
Дата 3.6.2015, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Здравствуйте, ниже код, где Struct01 это структура.

Код

Struct01 *pS = (Struct01*)&pObjData->dwData;


Из вышеописанного кода хотелось бы понимать что означает 

1).  &pObjData->dwData                      ; можно ли так написать?
2).  (Struct01*)&pObjData->dwData     ; что все это означает ?
PM MAIL   Вверх
konshyn
Дата 3.6.2015, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Код

Struct01 *pS;   // это указатель на структуру
 &pObjData->dwData;    // & - операции взятия адреса. В данном случае здесь хотят получить адрес pObjData->dwData
(Struct01*)&pObjData->dwData; // видимо, dwData имеет тип отличный от Struct01, поэтому нужно сделать преобразование адреса.





--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
rudolfninja
Дата 3.6.2015, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Здравствуйте.

Цитата(Robix @  3.6.2015,  11:06 Найти цитируемый пост)
 &pObjData->dwData 

Если я правильно помню приоритеты операций, то сначала будет выполнена операция (pObjData->dwData), а затем вы получите адрес этой области памяти с помощью оператора &.


Цитата(Robix @  3.6.2015,  11:06 Найти цитируемый пост)
(Struct01*)&pObjData->dwData

(&pObjData->dwData) - вот тут вы получили адрес dwData, а (Struct01*) приводит этот адрес к указателю на Struct01.
PM MAIL Skype   Вверх
feodorv
Дата 3.6.2015, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Кстати, не очень хорошая конструкция. Судя по названию dwData определена как DWORD, а в неё запихивают адрес некой структуры. В 64-х битном окружении возможны большие проблемы.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Robix
Дата 3.6.2015, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Спасибо. Теперь все ясно.
PM MAIL   Вверх
baldina
Дата 4.6.2015, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(feodorv @  3.6.2015,  13:24 Найти цитируемый пост)
Судя по названию dwData определена как DWORD, а в неё запихивают адрес некой структуры.

к указателю на структуру приводится адрес dwData, а не значение
PM MAIL   Вверх
Robix
Дата 4.6.2015, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Ктати, хотел уточнить, после
Код

Struct01 *pS = (Struct01*)&pObjData->dwData;


получается, что тип по адресу переменной dwData будет "указатель на структуру Struct01". И получается что одному указателю присваивается другой. Это не тот случай,
когда один указатель указывает на другой? Я читал, что если один указатель на другой указывает, то нужно две звездочки ставить, типа так 
Код

Struct01 **pS


Или я не так понял?
PM MAIL   Вверх
rudolfninja
Дата 4.6.2015, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Вы не так поняли. Тут не присваивается одному указателю другой указатель.
Тут указателю присваивается адрес dwData. Указатель - это просто переменная, в которой хранится какой-то адрес.
Две звездочки ставится в случае указателя на указатель.
PM MAIL Skype   Вверх
feodorv
Дата 4.6.2015, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(baldina @  4.6.2015,  01:54 Найти цитируемый пост)
к указателю на структуру приводится адрес dwData, а не значение 

Прошу прощения, был невнимателен.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldina
Дата 4.6.2015, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Robix @  4.6.2015,  11:08 Найти цитируемый пост)
указатель указывает на другой

указатель хранит адрес переменной, содержащей значение какого-то типа
если в переменной хранится адрес, т.е. она сама является указателем, то указатель на неё будет указателем на указатель,
т.е. будет хранить адрес переменной, содержащей адрес

Код

int x; // переменная целого типа
int* p = &x; // указатель на переменную целого типа
int** q = &p; // указатель на указатель на переменную целого типа


Это сообщение отредактировал(а) baldina - 4.6.2015, 16:46
PM MAIL   Вверх
Robix
Дата 4.6.2015, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Спасибо.
Только вот что еще интересно:

Почему так нельзя написать, где Struct01 без звездочки? Потому-что тип для адреса можно приводить только указатель?
1).
Код

Struct01 *pS = (Struct01)&pObjData->dwData;


А если так написать с целью сделать тоже самое, это правильно?
2).
Код

Struct01 *pS = &(Struct01)pObjData->dwData;


PM MAIL   Вверх
rudolfninja
Дата 5.6.2015, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Цитата(Robix @  4.6.2015,  17:18 Найти цитируемый пост)
Почему так нельзя написать, где Struct01 без звездочки?

Потому что, таким образом, вы пытаетесь привести адрес dwData к типу своей струкутры. 
То есть, если тут все сработает (что, конечно, не верно)
Код

(Struct01)&pObjData->dwData;

То на выходе вы получите объект структуры Struct01.
А затем вы пытаетесь этот объект привести к типу указателя на этот объект.

Цитата(Robix @  4.6.2015,  17:18 Найти цитируемый пост)
А если так написать с целью сделать тоже самое, это правильно?


Чисто теоретически, должно сработать, но не уверен.
PM MAIL Skype   Вверх
baldina
Дата 5.6.2015, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Robix @  4.6.2015,  17:18 Найти цитируемый пост)
А если так написать с целью сделать тоже самое, это правильно?

нет. приводить можно только приводимые (совместимые) типы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.