2016-11-10 4 views
-4

Мне было интересно, почему вы можете использовать указатель void для неуказанного типа, а не только void.Like:Почему void * и не просто пустота?

данные недействительны;

void * данные;

void & данные;

Так почему же он должен быть указателем, а не ссылкой или без каких-либо из них? Надеюсь, ты получишь меня! Спасибо

+0

высоко родственный: http://stackoverflow.com/questions/1043034/what-does-void-mean-in-cc-and-c –

+0

Я не» t видите «void» или «void *» в вашем примере «Like this». О чем ты говоришь? – AnT

ответ

3

void Поскольку и void* описаны отдельно и, в частности, в стандарте:

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

также,

тип указателя на void или указатель на тип объекта называется объект типа указателя. [Примечание: указатель на void не имеет типа указателя на объект , поскольку void не является типом объекта. -end примечание]

и

Объект типа сорта void* должен иметь такое же представление и требования к выравниванию как сорта char*.

2

void is nothing. Он не может быть создан. Это означает, что ссылка на void бессмысленна, потому что ссылка, в отличие от указателя, ДОЛЖНА иметь (или иметь в случае ошибки программирования) какой-то экземпляр, к которому он относится.

A void * является оставленным от C, где у вас нет проверки строгого типа и полиморфизма, чтобы помочь в предоставлении анонимных или произвольных данных для общей функции. По-прежнему необходимо вызывать функции C, чтобы они могли жить. Я рекомендую не использовать его в чистом коде C++ без уважительной причины.

Пример: Функция переменного тока с обратным вызовом

void myfunction(void * userp) 
{ 
    MyClass * ojb = (MyClass *) userp; 
    obj->doStuff(); 
} 

void theirCFunction(void(*callbackfp)(void *), void * userp) 
{ 
    //Crom knows what happens in here, but sooner or later it 
    callbackfp(userp); 
} 

и это устанавливается с

MyClass mine; 
theirCFunction(&myfunction, &mine); 

В C-то ++ более, как это было бы предпочтительным

void theirFunction(GenericCallback * p) 
{ 
    //Crom knows what happens in here, but sooner or later it 
    p->doStuff(); 
} 

и использования

MyClass mine; 
theirFunction(&mine); 

где MyClass реализует реализует интерфейс, определенный GenericCallback

+0

Хм спасибо! Но я до сих пор не могу понять, почему «недействительные данные» неверны, а «void * data» - нет? Еще раз спасибо –

+0

@ThatGuy Потому что правила. 'void' не является типом данных, который вы можете создать. Это место-владелец ни для чего, ни для каких данных. Вы не можете распределять хранилище ни для чего. Указатель - это ссылка на данные именованного типа. Указатель на 'void' был определен стандартом как указатель на данные неизвестного типа. Указатель на что-то, поэтому есть выделенное хранилище, но вы не знаете, что это такое. – user4581301