It's pretty simple once you get you head round it:
A void pointer can hold the address of any kind of data:
void* vp;
int* ip = &ai[2];
char* cp = "hello";
vp = ip;
vp = cp;
All are valid.
But since you can't declare a variable as
void v;
You can't "dereferrence" the pointer by trying to access the value it is pointing at:
*vp = i;
DoSomething(vp->member);
Both are illegal.
There are good reasons for this, apart from the understandable lack of a "void" type variable: pointers are not all the same. A pointer to an int can only hold physical addresses which are aligned on a word boundary - because integers are word based values. Char Ballard pointers aren't, because chars are byte aligned.