void identifica un tipo de dato indefinido. En las funciones, se utiliza para indicar que ésta no devuelve un valor:
void foo()
{
}
int i = foo(); // esto es incorrecto
void v; // también es incorrecto
En C --que no C++-- es necesario indicarle al compilador si hay parámetros o no los hay. Para hacerle saber que no hay, se emplea void:
void foo(void)
{
}
Finalmente, puedes emplear un puntero a void (void*) como un apuntador a un bloque de memoria indefinido, y por lo cuál puedes manipular cualquier tipo de dato.
void foo(void* p)
{
memset(p, 0, sizeof(p));
}
int i; long l; char c; double d;
foo(&i);
foo(&l);
foo(&c);
foo(&d);
Jejeje, que de hecho mi foo hace lo mismo que hace el memset: esta función también tiene como parámetros un void*.