Да, ступил малость. Указатель на функцию - это указатель на неполный тип и его можно только разименовывать, адресная арифметика недопустима.
И ругня на тот второй мой пример, думаю, связана только с этим, а не с тем, что указатель на int и указатель на функцию - это какие-то "разные" указатели.
Можешь проверить, ругня на эти две строки должна быть одинаковая, хотя структура st_t, да ещё и в ОЗУ - может размещаться по любому адресу.
struct st_t;
struct st_t *pst;
void foo(void) {
* ((void(*)())0 + 3) ();
pst = (struct st_t*)0 + 3;
}
Т.е. выравнивание тут ни при чём. Насколько я помню, у MSP430 не только команды, но и 16-битные переменные не могут размещаться по нечётному адресу, интересно - что компиляторы по его поводу думают :-)