void pointers aren't overly useful, they are just required. Memory allocation systems don't allocate to a type, but an address with a data range, which is a void pointer. ( explicit 'operator new' over plain old 'new' )
Also before templates were fully formed, people wrote functions like
void DoStuff( void *v_Data, int i_Size )
{
//Do stuff
return;
}
With the only benefit for using it over typed pointers was to remove casting everything to a standard type. ( Any pointer type can be implicitly cast to void* but not the other way around ).
Also there is this example.
void Foo(void (*fp)(void *), void *q) {
fp(q);
}
This use of void*allows Foo to take a pointer to a function and handle any type of argument.