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.