Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Конструкция, где идет * и затем сразу &


Автор: Robix 3.6.2015, 11:06
Здравствуйте, ниже код, где Struct01 это структура.

Код

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


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

1).  &pObjData->dwData                      ; можно ли так написать?
2).  (Struct01*)&pObjData->dwData     ; что все это означает ?

Автор: konshyn 3.6.2015, 12:30
Код

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



Автор: rudolfninja 3.6.2015, 12:32
Здравствуйте.

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

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


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

(&pObjData->dwData) - вот тут вы получили адрес dwData, а (Struct01*) приводит этот адрес к указателю на Struct01.

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

Автор: Robix 3.6.2015, 23:17
Спасибо. Теперь все ясно.

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

к указателю на структуру приводится адрес dwData, а не значение

Автор: Robix 4.6.2015, 11:08
Ктати, хотел уточнить, после
Код

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


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

Struct01 **pS


Или я не так понял?

Автор: rudolfninja 4.6.2015, 11:29
Вы не так поняли. Тут не присваивается одному указателю другой указатель.
Тут указателю присваивается адрес dwData. Указатель - это просто переменная, в которой хранится какой-то адрес.
Две звездочки ставится в случае указателя на указатель.

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

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

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

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

Код

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

Автор: Robix 4.6.2015, 17:18
Спасибо.
Только вот что еще интересно:

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

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


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

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


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

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

(Struct01)&pObjData->dwData;

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

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


Чисто теоретически, должно сработать, но не уверен.

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

нет. приводить можно только приводимые (совместимые) типы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)