The result of both the malloc(numelements * sizeof(element)) and calloc(numelements, sizeof(element)) is likely to be the same pointer. But malloc does not initialize memory so you may be left with a rather sizeable field of garbage. In some cases it won't matter, but sometimes it will.
calloc() is handy when you want to be sure memory is "cleared" before processing. There are cases where (for example) not all elements in a struct are assigned values right away. These may be added by subsequent procedures or left entirely blank (it's common practice in Windows programming, btw) so you want to be sure they are not left with whatever garbage was in memory when you created them.
For the question about 0 and null ... 0 is a number, null or NULL is a void pointer to memory address 0. It may be compiler dependent but there are situations where the distinction does matter. Best practice would seem to indicate that when testing pointers test them against NULL or null (depending on your compiler) and save the 0 for numbers.