Я изучаю C++ с нуля, и как таковой, у меня нет опытного понимания C. В C++ Вы не можете бросить пустой указатель на то, что, и я понимаю причины позади этого. Однако я знаю, что в C, Вы можете. Каковы возможные причины для этого? Просто кажется, что это быть огромной дырой в безопасности типов, которая (мне) походит на плохую вещь.
Вы можете преобразовать void *
в другой указатель на обоих языках. Возможно, вы имели в виду неявно.
В C очень удобно не говорить об этом явно. В C ++ у нас есть шаблоны, поэтому для написания универсального кода нет необходимости в приведении типов void *
и так далее. В C нет выбора. Универсальный контейнер должен содержать void *
для объектов, и гораздо проще многократно сказать mydata * d = node;
, тогда это будет mydata * d = (mydata *) узел;
.
Так что все примерно так, как вы сказали. В целом безопасности типов C не уделялось столько внимания, как в C ++, особенно когда дело доходило до void *
, потому что предполагалось, что это простой универсальный указатель на что угодно. В C ++ в этом нет необходимости, поэтому лучше сделайте это явным, когда вы имеете дело с этим.
Одна причина: если вы используете sort
для сортировки массива структур и у вас есть функция сравнения для двух структур, вы вам нужно будет преобразовать указатели void в указатели на структуры для доступа к членам структуры.
Каковы возможные причины [приведения указателя
void *
в C]? Разве это не гигантская дыра в безопасности типов?
Это единственный возможный способ поддержки полиморфизма, также известного как универсальное программирование. Нет другого способа создать, например, общую хеш-таблицу. Полиморфизм в C в высшей степени небезопасен, но это единственный полиморфизм, который существует.
Радуйтесь, что C ++ имеет параметрический полиморфизм (одна из многих функций шаблонов).