Стандарт C99 гласит, что при преобразовании целочисленного значения 0
в указатель он становится указателем NULL. Так что ((char*)0)
- это пустой указатель. Указатель NULL не обязательно должен иметь фактическое двоичное представление 0
. Это может быть, например, 0x12345678
.
Стандарт C дополнительно утверждает, что при преобразовании указателя NULL в целочисленную константу результат «определяется реализацией». В действительности то, что делают компиляторы, просто приводит числовое значение указателя к соответствующему целочисленному значению, как сказал AndreyT. Таким образом, в приведенном выше примере целочисленное значение может в конечном итоге составить 0x12345678
, хотя технически это может быть что угодно (т. Е. Компилятору разрешено говорить «преобразование указателя NULL обратно в целочисленное значение приводит к значению 0xDEADBEEF
»). «). Обратите внимание, что это означает, что даже на платформах, где указатель NULL имеет значение 0
, компилятору разрешается преобразовывать его в произвольное целочисленное значение при преобразовании. В действительности, однако, никакие компиляторы не делают этого, потому что это было бы довольно безумно.
Так что, да, стандарт C позволяет многое. В действительности любая платформа, на которой вы, вероятно, будете работать, будет представлять указатель NULL как 0
, а преобразование указателя NULL в целочисленное значение приведет к 0
. Посмотрите здесь (раздел 1.14) для списка некоторых исключений (неясных) архитектур, которые не используют 0
для указателя NULL.