вот типа использование 0 адреса как нулевого указателя - один из компромиссов - потеряв по сути одно слово машинное из адресного пространства мы получаем возможность в рантайме по сути "изменять тип указателя" делая его с точки зрения языка инициализированным/не инициализированным, при этом сохраняя статическую типизацию
в принципе - никто не мешает, например, использовать один бит из отведенных под указатель как флаг - инициализирован он или нет, как для знаковых чисел, тогда мы сможем по нулевому адресу обращаться, но при этом потеряем половину адресов
вот взять годболт например - мы можем сказать что это интерпретатор а компиляторы - часть интерпретатора мы вставляем текст программы и получаем результат