Прежде всего, вы используете C ++.
In windows.h
VOID
и PVOID
определены как void
и void*
соответственно.
#define VOID void
typedef void *PVOID;
Давайте рассмотрим базовую программу:
#include <iostream>
using namespace std;
void foo(void** pp)
{
int i = *((int*) *pp);
cout << i << endl;
}
int main()
{
int i = 10;
int *p = &i;
foo((void**) &p); // call #1
foo(&(void*&) p); // call #2
}
В первом случае мы берем адрес p
, то есть int**
, и передаем его в foo()
, приводя его к void**
.
Во втором случае мы сначала приводим p
к void*&
, а затем берем его адрес, который будет void**
, и передаем его foo()
. Причина void*&
, а не void*
в том, что вы можете использовать унарный оператор &
(адрес) только для lvalue .