Вопрос: Пусть NULL был определен следующим образом:
  #define NULL ((char *)0)

Ознает ли это, что функциям можно передавать NULL без преобразования типа?

Ответ:
В общем, нет. Проблема в том, что существуют компьютеры, которые используют различные внутренние представления для указателей на различные типы данных. Предложенное определение через #define годится, когда функция ожидает в качестве передаваемого параметра указатель на char, но могут возникнуть проблемы при передаче указателей на переменные других типов, а верная конструкция
  FILE *fp = NULL;

может не сработать.

Тем не менее, ANSI C допускает другое определение для NULL:
  #define NULL ((void *)0)

Кроме помощи в работе некорректным программам (но только в случае машин, где указатели на разные типы имеют одинаковые размеры, так что помощь здесь сомнительна) это определение может выявить программы, которые неверно используют NULL (например, когда был необходим символ ASCII NUL; см. вопрос 1.8).

Смотри: ANSI Rationale Разд. 4.1.5 c. 74.
Автор: Кодт    Оценить