It'll be easier to answer the second question first, so here goes:
It's fairly common to check a pointer to see if it's NULL before using it, to make sure that it is a valid pointer.
After you free the memory used by whatever a pointer was pointing at, you'll still have a pointer pointing to the same memory location, even though this memory location might subsequently be reassigned and used for some other purpose.
By setting the pointer to NULL, you make sure that you don't accidentally use the pointer elsewhere in your code: If you check for NULL pointers, you'll discover that this pointer is NULL, if you don't check (tsk tsk) then your program will likely crash, which is probably better then having unpredictable memory corruption since it will be easier to debug.
If you malloc and there is insufficient memory available, the returned pointer will be NULL.
It is important to remember that pointers and allocated memory are seperate. You can have a pointer pointing to unallocated memory, and you can have allocated memory without anything pointed to it. Although you generally want to avoid either of these situations.