These are general purpose pointers which do not have any type associated with them and can contain the address of any type of variable. So basically, the type of data that it points to can be anything.
int n=10; char c='A'; void *p; p=&n; printf("%d", *(int*)p); //output: 10 p=&c; printf("%c", *(char *)p); //output: A
Hence we need not declare pointers for every data type. A single void pointer can be used to store the address of any type of variable and late be dereferenced.
NULL Pointer is a pointer which is points to nothing. In case, if we don’t have the address to be assigned to a pointer, then we can simply use NULL.
Check out Dangling pointer here - https://www.faceprep.in/procoder/knowledgebase/dangling-pointer-in-c/