Постоянно наталкиваюсь на путаницу между нулевым указателем и нулевым адресом. А ведь это разные вещи. И нулевой указатель может не указывать на нулевой адрес.
Нулевой указатель — собый указатель, гарантированно не ссылающийся на объект или функцию.
Нулевой адрес — просто адрес со значением ноль.
Присваивание нуля (и сравнение с нулём) — на самом деле это не присваивание, это специальная инструкция компилятору, которая заставляет считать указатели нулевыми указателями.
Dim p As Integer Ptr = 0
Такая операция превращает p в специальный указатель (нулевой). В популярных архитектурах нулевой указатель указывает на нулевой адрес, но это чистое совпадение, и нельзя закладываться на это поведение.
Чтобы гарантированно получить нулевой адрес, например, можно обнулить указатель через memset:
memset(@p, 0, sizeof(p))
Теперь p
указывает на нулевой адрес, но это не делает p
нулевым указателем.
А в чём же отличие нулевого указателя, от нулевого адреса?
Разыменование нулевого указателя — неопределённое поведение. Разыменование нулевого адреса — законная операция.