Зачем вводить указатель на пустоту?
Будучи новичком в C, единственное практическое использование, которое я получил из указателей void, - это универсальные функции, которые могут хранить разные типы данных в заданном указателе. Поэтому при выполнении выделения памяти я не набирал текст.
Я видел примеры кода, которые иногда используют указатели void, но они получают тип. Почему это полезно? Почему бы прямо не создать нужный тип указателя вместо пустоты?
Ответы
Ответ 1
Есть две причины для литья указателя void на другой тип в C.
- Если вы хотите получить доступ к тому, на что указывает указатель (
*(int*)p = 42
) - Если вы на самом деле пишете код в общем подмножестве 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);
}