QUOTE (_Pasha @ Feb 17 2011, 09:29)

Что мне всегда нравилось в определяющих Си стандартах - так это полное отсутствие логики.
Если их не читать - то так и будет казаться. По определению Стандарта NULL - указатель, который не указывает ни на один объект. Не "нулевой указатель", не "указатель на ноль", а именно "указатель, который указывает в никуда". Конкретное его значение отдано на откуп компилятору.
QUOTE (Twen @ Feb 17 2011, 09:20)

В результате я получил два идентичные результата...
Конечно. А что вы ожидали, сделав явное приведение типа x((char*)NULL)? Вы сделали явное приаведение типа - компилятор умывает руки. В языке C void * неявно приводится к указателю на любой тип и указатель на любой тип неявно приводится к void *. Поэтому в функции memcpy(), memset() и тому подобные можно передавать
указатель на любые данные без явного приведения типов. И поэтому результат malloc() можно присвоить
указателю на любой тип без явного приведения. Если бы вы написали x(NULL) - вы получили бы то, что ожидается.
В С++ разрешено только неявное приведение любого указателя к void *. И там добавлено неявное преобразование константы 0 к указателю на любой тип, тоже в смысле "указатель, который указывает в никуда". Какое именно значение будет занесено в указатель в результате приведения константы 0 не оговаривается. А макрос NULL в C++ изначально был введен только для совместимости исходников с С. В новом стандарте его вводят снова - с константой 0 возникают неоднозначности c перегрузкой операторов.