Почти. Вы бросаете объект *, и забыли взять адрес. Давайте еще раз спросим следующее:
((int*)&myObject)[0] == i1
Вы должны быть очень осторожны с такими предположениями. Поскольку вы определили структуру, это должно быть верно для любого компилятора, с которым вы можете столкнуться. Но всевозможные другие свойства объекта (которые вы, возможно, пропустили в своем примере), как другие говорили, сделают его не POD и могут (возможно, в зависимости от компилятора) сделать приведенное выше утверждение неверным.
Обратите внимание, что я не буду так быстро говорить вам, что это сработало бы, если бы вы спросили о i3 - в этом случае, даже для простого POD, выравнивание или порядковый номер могут легко вас испортить.
В любом случае, вам следует избегать такого рода вещей, если это возможно. Даже если сейчас он работает нормально, если вы (или кто-то еще, кто не понимает, что вы делаете этот трюк) когда-нибудь измените порядок структуры или добавите новые поля, этот трюк потерпит неудачу во всех местах, где вы его использовали, что может быть трудно найти.
Ответ на ваши изменения: Если это все определение вашего класса, и вы используете один из основных компиляторов с опциями по умолчанию и работаете на процессоре x86, то да, вы, вероятно, догадались о правильном расположении памяти. Но выбор компилятора, параметров компилятора и другой архитектуры процессора может легко опровергнуть ваши предположения.