Но NULL в зависимости от реализации не обязан быть именно 0. Это зависит от фантазии разработчиков компилятора.
это зависит от libc, не зря NULL описан в разделе 18 "Language support library".
Лично мне не известно ни одной реализации, где NULL был бы отличен от 0, но это не означает, что таких реализаций не может быть вообще. Поэтому программистам С++ рекомендуют использовать 0 вместо NULL.
Сам NULL тут ни при чём, и скорее всего что он будет именно 0. Тут дело в бинарном представленни нулевого указателя, и
компилятор должен отслеживать присвоения типа ptr = 0; и использовать implementation-defind value в качестве бинарного представления нулевого указателя.