В ранние времена языка C у C не было типа void *
(он появился позже, фактически был заимствован из C ++), и вместо него использовался тип char *
в качестве общего типа указателя «сырой памяти». Таким образом, даже по сей день вы можете увидеть это обычное элементарное использование типа char *
в качестве универсального типа указателя в коде и увидеть другие типы указателей, явно преобразованные в char *
в контексте универсального указателя. Я предполагаю, что код, который вы цитировали, делает это по этой конкретной причине. (Если только вы не поставили этот char *
актерский состав там. В этом случае я могу только спросить «Почему?».)
В современном C первый параметр fread
имеет тип void *
, что означает, что приведение не требуется. Это
fread(passenger, sizeof *passenger, 1, in_fp);
будет работать так же хорошо.
Ваша версия &passenger
не имеет смысла, поскольку, очевидно, первоначальная цель заключалась в том, чтобы считывать данные в местоположение, на которое указывает passenger
, а не в сам объект-указатель passenger
.