Wszystko już koledzy świetnie wytłumaczyli, a ja wtrącę małą dygresję.
Z tego samego powodu, przez który nie domyśliłeś się, że to zwykłe rzutowanie, ten sposób rzutowania jest odradzany. Rzutowanie to istotna operacja, a w ogóle się nie wyróżnia.
(void *)buffer; // Rzutowanie.
void (*buffer)(); // Wskaźnik na funkcję
Gdybyś chciał w kodzie wyszukać gdzie coś rzutowałeś, to Ctrl + F będzie bezużyteczny. Dlatego wymyślono operatory rzutowania, które widać z bardzo daleka i bardzo dobrze, bo jak wspomniałem: rzutowanie, to ważna operacja.
Obecnie należy korzystać z:
static_cast< >
reinterpret_cast< >
const_cast< > <--- używanie tego operatora, to grzech niewybaczalny XD
dynamic_cast< >