Quote Originally Posted by Sabidos
So does that mean that those values can be used on pointers of any type? For example, are these valid null pointers?
They look fine to me. Instead of being too concerned with such details, just use NULL and compile at a high warning level to help to detect issues.

Quote Originally Posted by Sabidos
And it also means that the NULL macro may be either (void *)0, or just plain 0 or even 0L.
Yes.

Quote Originally Posted by Sabidos
So this means those constants casted to a specific type are valid null pointers for that type, but not for another one?
What that part of the standard actually means is that null pointers are guaranteed to compare unequal to pointers that actually point to something, be it an object or a function. It's not concerned about null pointers of different types.

Having said that, it would be confusing to use a null pointer of type int* when you want to initialise a pointer to float. Don't do that, even if your compiler allows it.