Почему void ** можно инициализировать только void *?

Void-указатель (void *) - это универсальный указатель в языке программирования C, который может указывать на объект любого типа. Такая возможность может быть очень полезной, когда нам нужно иметь указатель, но мы не знаем точный тип объекта, на который он должен указывать.

Void-указатели могут быть инициализированы только с помощью объектов типа "void *". Это связано с тем, что все указатели имеют определенный тип в языке C, и указатель типа "void **" указывает на другой указатель типа "void *".

Инициализация указателей типа "void **" объектом типа "void *" является естественным требованием языка C, чтобы обеспечить безопасность типов. Если разрешить инициализацию указателя типа "void **" объектом другого типа, это может привести к проблемам безопасности и не определенному поведению программы.

Простым примером могут быть указатели на указатели. Мы можем использовать указатель типа "void **" для хранения адреса другого указателя, который указывает на объект некоторого типа. Таким образом, указатель типа "void **" может быть использован для создания массива указателей на различные типы объектов, что облегчает управление и доступ к этим объектам.

В целом, ограничение на инициализацию указателей типа "void **" только указателями типа "void *" связано с необходимостью обеспечить безопасность типов в языке C и предотвратить возможные проблемы с использованием некоторых функций, операций и конструкций языка.