Растолкуйте

Герой дня
Дата: 13.03.2015 18:03:41
Вот этот пример-решение

*(T*)&ptr=x;


17381263

вот это (T*) - приведение к ссылке адреса &ptr

а это *(T*)&ptr - взятие значения по этому адресу, верно ?
White Owl
Дата: 13.03.2015 18:19:47
Герой дня
Вот этот пример-решение

*(T*)&ptr=x;


17381263

вот это (T*) - приведение к ссылке адреса &ptr
Не совсем... Тут предполагается что ptr это простая переменная одного типа, а x это простая переменная другого типа.
T x;
S ptr;
ptr = x; // ошибка, несовпадение типов
ptr = (S)x; // нет ошибки синтаксической, но легко увидеть если ошибка логическая (если T нельзя приводить в S).

А теперь мы приходим к кошмару:
&ptr - указатель на тип S
(T*)&ptr - превращаем указатель на S в указатель на T
*(T*)&ptr - сюда уже можно писать.

Ну и как wst сказал в цитируемом посте: "Если цель просто скомпилировать..."

*(T*)&ptr=x; Скомпилируется без проблем, но правомочность такого приведения никто не гарантирует.
По существу это тоже самое что и ptr = (S)x. Но когда мы знаем что x это число, а ptr это класс - сразу возникнут сомнения в разумности написавшего. А через обилие спецсимволов и конвертаций это можно замаскировать...

По существу это чистое вредительство.
Герой дня
Дата: 13.03.2015 18:34:41
White Owl,

спасибо, теперь стало ясно
wst
Дата: 13.03.2015 18:38:30
Самое интересное в таком решении - если писать через *(T*)&ptr, а читать весь ptr. И писать туда значения размерами, например, по очереди 4 и 2 (ну и, главное, читать их потом), не обнуляя при этом этот самый несчастный ptr. Зато счастлив компилятор.
Герой дня
Дата: 13.03.2015 18:47:01
wst,

мало что понял, почему 2 и 4, например..
wst
Дата: 13.03.2015 18:54:13
Ок,
1. запустились, ptr = NULL (присваивание было в коде в исходном сообщении)
2. сделали f((int32_t)0xffff)
3. прочитали ptr, там 0xffff
4. сделали f(' ')
5. прочитали ptr, там не ' ', а 0xff20, как говорится "счастливой отладки"
Герой дня
Дата: 13.03.2015 19:06:05
wst,

понятно, спб!