A little off-topic but here is a cool piece of code about a special case in C:
void (*foo)() = 0;
void (*bar)() = (void *)0;
void (*baz)() = (void *)(void *)0; // Error
Can you guess why compilers reject the last line?