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

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

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

Ответ 1

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

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

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

Ответ 2

Вам нужно указать указатели 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 */
}

Ответ 3

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

typedef struct CombinedData
{
   int memberA;
   double memberB;
} CombinedData;

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