c++ c void-pointers

c++ - Modelo mental para void*y void**?



void-pointers (5)

Nota: Soy un programador experimentado en C ++, por lo que no necesito ningún concepto básico de puntero. Es solo que nunca trabajé con void** y tengo dificultades para ajustar mi modelo mental a void* vs. void** . Espero que alguien pueda explicar esto de una buena manera, para poder recordar la semántica más fácilmente.

Considere el siguiente código: (compila con, por ejemplo, VC ++ 2005)

int main() { int obj = 42; void* ptr_to_obj = &obj; void* addr_of_ptr_to_obj = &ptr_to_obj; void** ptr_to_ptr_to_obj = &ptr_to_obj; void* another_addr = ptr_to_ptr_to_obj[0]; // another_addr+1; // not allowed : ''void*'' unknown size ptr_to_ptr_to_obj+1; // allowed }


Un void * puede apuntar a cualquier cosa (excepto funciones). Por lo tanto, incluso puede apuntar a los punteros, por lo que puede incluso apuntar a otros objetos void * .

Un void ** es un puntero a void * , por lo que solo se puede usar para apuntar a objetos void * .


Un void* apunta a un objeto cuyo tipo es desconocido para el compilador.

Un void** apunta a una variable que almacena dicho void* .


void* es un indicador de algo, pero no sabes qué. Como no sabe lo que es, no sabe cuánto espacio ocupa, por lo que no puede incrementar el puntero.

void** es un puntero a void* , por lo que es un puntero a un puntero. Sabemos la cantidad de punteros que ocupa la sala, por lo que podemos incrementar el puntero void** para que apunte al siguiente puntero.


void es engañoso porque suena null . Sin embargo, es mejor pensar en el void como un tipo no especificado. Por lo tanto, un void* es un puntero para un tipo no especificado, y un void** es un puntero a un puntero para un tipo no especificado.


void es un tipo que no tiene objetos.

void * es un tipo escalar convencional.

void ** también es un tipo escalar convencional que apunta a void * .

void * se puede usar para señalar cualquier cosa, pero prefiero usarlo solo para el almacenamiento sin inicializar. Por lo general, hay una mejor alternativa para apuntar un void * a un objeto real.