Указатель на любой тип может быть свободно преобразован в void *
или без него.
Раздел 6.3.2.3p1 C стандарта гласит:
Указатель на void может быть преобразован в или из указателя на любой объект
тип. Указатель на любой тип объекта может быть преобразован в
указатель на void и обратно; результат должен сравниться равным
к исходному указателю.
Единственное время, когда требуется приведение, - это если вы передаете указатель на переменную функцию, такую как printf
, где неявное преобразование не может произойти, поскольку оно не будет знать, какой именно тип передается.
Обратите внимание, что, как и для любого типа указателя, вы не можете "удалить" квалификатор, такой как const
, при передаче в функцию без приведения. Разделы 6.3.2.3p2 гласят:
Для любого квалификатора q указатель на не квалифицированный тип q может быть преобразован в указатель на q квалифицированную версию тип; значения, сохраненные в исходном и преобразованном указателях, должны сравниваться равными.