I believe the reason for NULL to be declared as (void *)0 is two-fold:
- Allows NULL to be a pointer type so the compiler can tell if the user is using NULL properly (ie. int x = NULL; will produce a warning).
- NULL might not be 0 on some systems, hence the cast from 0 to void * allows the compiler to do any required things to the 0 before continuing.