1 minute read

整理自 Thinking in C++

If you state that a pointer is a void *, it means that any type of address at all can be assigned to that pointer (whereas if you have an int *, you can assign only the address of an int variable to that pointer). For example:

void *vp;
char c;
int i;

// The address of ANY type can be assigned to a void pointer:
vp = &c;
vp = &i;

Once you assign to a void * you lose any information about what type it is. This means that before you can use the pointer, you must cast it to the correct type:

int i = 99;
void *vp = &i;

// CANNOT dereference a void pointer:
// *vp = 3; // Compile-time error
// MUST cast back to int before dereferencing:
*((int*)vp) = 3; // OK

There’s one last item to mention. In C, you could assign a void* to any other pointer. But in C++, this is not allowed because of stricter type check.

int i = 10;
void* vp = &i; // OK in both C and C++
int* ip = vp; // ONLY acceptable in C

In general, void pointers should be avoided, and used only in rare special cases.

You CANNOT have a void reference.