data=data; is pointless, it assigns the value of a variable to that variable. The only thing this assignment will do, apart from waste time if the compiler doesn't optimise it out, is to stop the compiler complaining about an unreferenced variable.
void * X; defines X as a variable of type pointer-to-void. X can point at anything.
*X dereferences X; it takes the memory location stored in X and looks up what is in that memory location.
So if X contains 1000, and memory location 1000 contains the value 5, then a=*X; will assign 5 to a.
The asterisk in a different context means multiply (a=5*7; will assign 35 to a), and can also be used multiple times on a pointer-[to-pointer]^n, e.g
if 1000 contains the value 1004, and 1004 contains the value 1008, and 1008 contains the value 5, and X contains the value 1000, then a=***X; will assign 5 to a.
=* used to be a synonym for *=, so a=*X might need rewriting as a= *X to prevent the compiler trying to multiply a by X, depending on the compiler.