void *x;
является допустимым оператором.
void x;
не является допустимым оператором.
Функция, которая возвращает указатель на void, также является допустимой.
Почему это так?
Когда переменная объявлена в функции, компилятор должен выделить пространство памяти для переменной.Но когда переменная имеет тип void, компилятор не знает, сколько байтов выделено для этой переменной.Так что это не будет работать для компилятора.Однако указатель на void отличается.Указатель может иметь тип void, который может быть прочитан как int, или double, или как float, или short или char во время чтения.В этом случае требуется явное приведение типов или автоматическое продвижение типов, выполняемое компилятором.
например,
int
function_A( void *x )
{
int *p = (int *)x;
return *p;
}
double
function_B( void *x )
{
double *p = (double *)x;
return *p;
}
Важное примечание: C не допускает прямой тип-тип для разыменования пустого указателя.Под этим я подразумеваю, что вы не можете сделать это:
double
function_B( void *x )
{
return (double)*x;
}
Концептуально, это имеет смысл.Но С не позволяет этого.