TL DR , because different data types occupy different sizes in memory and have different alignment requirements.
To clarify, a pointer variable contains an address that points to some type of data. Without a bound type, there would be no way to dereference a pointer and get a value.
, , , .
, , .
void *, , , . , void.
void * , C11, §6.3.2.3
void . void ; .
, a void * , , ( ) .