При использовании gcc 4.3.4 с использованием ключей -O2 -Wstrict-aliasing ответ dreamlax выдаст:
warning: dereferencing type-punned pointer will break strict-aliasing rules
Добавлено: Я думаю, что возражения против ответа caf о порядковый номер и размер являются разумными, что его решение не касается (не каламбур). Предложение Дастина об использовании объединения типов, вероятно, является законным (хотя из того, что я читал, кажется, что есть некоторые споры, но ваш компилятор важнее закона). Но его код может быть упрощен (или запутан, в зависимости от вашего вкуса) одной строкой:
printf("%p\n", ((union {int (*from)(void); void *to;})funcptr).to);
Это удаляет предупреждение gcc о строгом псевдониме (но верно ли это?).
Совокупное приведение не будет «работать», если вы используете ключ -pedantic или, например, SGI IRIX, поэтому вам нужно использовать:
printf("%p\n", ((union {int (*from)(void); void *to;} *)&funcptr)->to);
Но что касается первоначального вопроса: его происхождение заключается в использовании -педантики, которая, я думаю, немного педантична:).
Дальнейшее редактирование: Обратите внимание, что вы не можете использовать main в последнем примере, как в:
printf("%p\n", ((union {int (*from)(void); void *to;}) main).to); // ok
printf("%p\n", ((union {int (*from)(void); void *to;} *)&main)->to); // wrong!
потому что, конечно, & main распадается на main .