Указатель void * может быть инициализирован любым указателем или адресом любого указателя.
Почему же нет такой типовой свободы указателей на указатель assignment from incompatible pointer type указателя на указатель?
#include <stdio.h>
int main ( void )
{
int * Ptri;
float * Ptrf;
void * Ptrv;
int * * PtrPtri;
float * * PtrPtrf;
void * * PtrPtrv;
Ptrv = Ptri;
Ptrv = Ptrf;
Ptrv = &Ptri;
Ptrv = &Ptrf;
Ptrv = PtrPtri;
Ptrv = &PtrPtri;
PtrPtri = &Ptri;
!!PtrPtri = Ptri;
PtrPtrf = &Ptrf;
!!PtrPtrf = Ptrf;
PtrPtrv = &Ptrv;
!!PtrPtrv = &Ptri;
!!PtrPtrv = &Ptrf;
}