Der void * ist ein ganz spezieller Pointer: Er zeigt nicht auf einen
Datentyp, sondern auf 'Nichts', Stefan "stefb" B. schon schrieb.
Bei gewöhnlichen Pointern wird Pointerarithmetik angewandt, wenn man
damit rechnet. So macht der Compiler z.B. aus diesem Ausdruck
int i[5] = { 0 };
int *pI = i + 3;
folgende Berechnung:
int *pI = (int *) ((char *) i + 3 * sizeof (int));
(Der Name eines Array-Objekts ohne Indizierung - i - ergibt einen
Pointer auf das 0. Element!)
Da ein void * auf ein unbekanntes Objekt ohne Länge zeigt, ergibt
Pointerarithmetik damit keinen Sinn, sondern ist ein Indiz für einen
Fehler -- der wird vom Compiler angezeigt.