Что такое тип данных PVOID?

Может кто-нибудь объяснить, что такое PVOID и как он используется в такой функции, как:

BOOL DoSomething(PVOID pMemPhy)

Ответ 1

указатель void, такой же, как

void *pMemPhy

aka "Указатель на что-то, но вам решать, чтобы понять это".

BOOL DoSomething ( PVOID pMemPhy )
{
    strcpy((char *)pMemPhy, "I love buffer overflows!");
    return TRUE;
}

Ответ 2

Это указатель void - указатель на адрес памяти без информации о типе значения, на которое он указывает. По этой причине перед использованием указателя вы должны указать указатель на тип, например (char *)pMemPhy или (int *)pMemPhy, чтобы компилятор знал, сколько памяти он работает (1 байт для char, 4 байта для int, и т.д.)

Ответ 3

typedef void * PVOID;

Если вы сомневаетесь в том, что используется указатель void? Наиболее распространенное использование - когда вы передаете указатель на память, который действительно не заботится о типе. free(), например.

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

Ответ 4

Как говорили другие, это эквивалентно void *.

void указатели часто используются в операциях памяти (memcpy, memset и т.д.), так как вы не хотите предполагать тип данных по указанному адресу.

Указатели и указатели пустот получают хорошее лечение в этой статье из http://cplusplus.com.

Ответ 5

Эта и другая мнемоника, такая как BOOL, LPCTSTR, имеют начало с Windows, BTW которой была разработана до существования стандарта C и не зависела в конкретном компиляторе, она использовала свои собственные типы.

Вы можете просмотреть блог Old New Thing, чтобы узнать больше о истории разработки Windows и о ее странностях, которые останутся у нас (http://blogs.msdn.com/oldnewthing).

Ответ 6

Похоже, это просто псевдоним (define или typedef) для void *. Я понятия не имею, почему люди думают, что это будет лучше, но я знаю, что некоторые API-интерфейсы любят использовать это в случае, если в будущем произойдет изменение типа.

Я знаю, что в ранних версиях Windows такие вещи, как STDCALL, были префиксом для многих функций, и определение STDCALL могло измениться в зависимости от той версии Windows, которую вы скомпилировали. Это из памяти (на которую на протяжении многих лет влияет алкоголь:-), поэтому не полагайтесь на это как на Евангелие. Это в основном правильно, но детали могут быть немного разными.