Потому что это такая специальная конструкция в языке. Например, если ты сделаешь не (void *)0, а (void *)my_func(), где my_func() всегда возвращает 0, то это уже будет адрес на 0x0.
Стандарт Си иногда чудаковатый, но ИМХО, пусть лучше такой, чем никакой