The standard does allow NULL to be an unadorned 0. In C99, 7.17p3 says NULL is "an implementation-defined null pointer constant". The term "null pointer constant" is defined in 6.3.2.3p3 as "[a]n integer constant expression with the value 0, or such an expression cast to type void *". C89 has the same language.
The upshot is that one should never assume that NULL is either an integral type or a pointer type, so:
Code:
printf("%p\n", NULL); /* bad */
printf("%p\n", (void *)NULL); /* good, if useless */
char x = NULL; /* bad; I've actually seen this */