"...pero luego puede volver a apuntar a otra direccion de memoria..."
Si, y aunque no la liberes tambien puedes reusar ese puntero (p.ej. las listas)
"...al usar free puedo volver a utilizar ese puntero? debo pedir nuevamente memoria?..."
Si y si; si bloqueas con malloc y liberas con free el puntero sigue apuntando a la direccion ahora ya no disponible para la aplicacion; si vuelves a bloquear con malloc ya tienes otra direccion (o la misma, no se sabe) utilizable por la aplicacion hasta el nuevo free o hasta que finalices.
Código:
int *num;//esto puede ser cualquier cosa, no necesariamente nulo
num = NULL;//ahora es nulo
num = malloc(sizeof(int));//bloqueas
num = 4;//asignas
free(num);//ahora la posicion de memoria sigue teniendo (int)4 pero no es accesible ni tampoco es nulo, segira siendo 4 hasta que esta aplicacion u otra bloquee esa direccion
num = NULL;//vuelve a ser nulo
num = malloc(sizeof(int));//posiblemente num seguira guardando 4
num = 5;//ahora vale 5
exit();//al finalizar por si solo se desbloquea la memoria, se recomienda desbloquear manualmente todo lo usado
Saludos
vosk