Зачем вводить указатель на пустоту?

Будучи новичком в C, единственное практическое использование, которое я получил из указателей void, – это универсальные функции, которые могут хранить разные типы данных в заданном указателе. Поэтому при выполнении выделения памяти я не набирал текст.

Я видел примеры кода, которые иногда используют указатели void, но они получают тип. Почему это полезно? Почему бы прямо не создать нужный тип указателя вместо пустоты?

Есть две причины для литья указателя void на другой тип в C.

  1. Если вы хотите получить доступ к тому, на что указывает указатель ( *(int*)p = 42 )
  2. Если вы на самом деле пишете код в общем подмножестве C и C ++, а не в «реальном» C. См. Также Я делаю результат malloc?

Причина 1 должна быть очевидной. Номер два – это потому, что C ++ запрещает неявное преобразование из void* в другие типы, в то время как C разрешает его.

Вам нужно указать указатели void на что-то другое, если вы хотите их разыменовать, например, вы получаете указатель void как параметр функции, и вы точно знаете, что это целое число:

 void some_function(void * some_param) { int some_value = *some_param; /* won't work, you can't dereference a void pointer */ } void some_function(void * some_param) { int some_value = *((int *) some_param); /* ok */ } 

Ваш указатель void может представлять собой более сложный тип, такой как структура, которая вам нужна для разыменования, чтобы получить доступ к членам.

 typedef struct CombinedData { int memberA; double memberB; } CombinedData; void fun(void* data) { CombinedData* p = (CombinedData*)data; doSomethingWith(p->memberA, p->memberB); }