Что касается C, это неопределенное поведение. Мое следующее предложение также является неопределенным поведением, но позволяет избежать всех проблем, связанных с типами и псевдонимами: Используйте символы.
int a = get_value();
char const * const p = (const char * const)&a;
char * q = (char *)0x12345;
memcpy(q, p, sizeof(int));
Кроме того, вы можете получить доступ к байтам q[i]
напрямую. (Это часть, которая является UB: указатель q
не был получен как адрес фактического объекта или как результат функции выделения. Иногда это нормально; например, если вы пишете автономно Программа, которая работает в реальном режиме и обращается к графическому оборудованию, вы можете записывать в графическую память напрямую по общеизвестному жестко закодированному адресу.)