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.