Давайте рассмотрим некоторую странную гипотетическую встроенную систему, в которой мне нужно создать и использовать указатель, который указывает или может указывать на первый байт моего адресного пространства. То есть указатель равен нулю. Не NULL-указатель, а совершенно допустимый нулевой указатель, который может быть разыменован, увеличен или обработан как массив, как любой другой указатель. Как бы я сделал это в языках, которые обрабатывают указатель NULL как особый, но не имеют реального типа NULL?
Весь «указатель NULL, имеющий специальное значение, отличное от 0, обработанного особым образом», возможен на некоторых редких старых машинах, но на практике ваш указатель NULL / 0, указывающий на адрес 0, будет иметь значение 0 и действительно будет указывать на адрес 0 на большинстве машин ,
Это будет совершенно разыменовано, и вы можете писать по этому адресу, если в этой области есть какая-то память.
Я имел обыкновение иметь это на встроенной платформе, с которой я работал. Поэтому я использовал точку наблюдения отладчика по адресу 0, поскольку все обращения к этой области были разыменованными указателями NULL. Поймал некоторые ошибки таким образом ^^
В большинстве архитектур вообще нет ничего особенного в указателе NULL, это просто обычный указатель с адресом 0. Если вы работаете со встроенной системой, в которой есть реальная память, она должна работать правильно. Единственная проблема возникает, если вы пытаетесь проверить указатель на нулевое значение, так что не делайте этого.
Если это помогает, определения регистра (указатель на конкретный адрес) записываются (в моей копии CodeWarrior) как:
#define REGISTER_XYZ (*(vuint32 *)(0x40100000))
Обратите внимание vuint, поскольку это нестабильное местоположение (может измениться вне нашего контроля), которое может иметь или не иметь отношение к вам.
И замените 0x40100000 на выбранный вами адрес, естественно.