Soy nuevo en C e bash controlar los punteros. Me encontré con esta expresión
char *foo = *(char **)bar;
¿Qué está pasando exactamente? Entiendo que * es puntero ** es puntero a puntero, pero realmente no entiendo lo que es la *(char **)bar
edición: vale la pena mencionar que la barra se declara como const void * bar
Tanto los principiantes como los expertos pueden beneficiarse de obtener los conceptos básicos realmente sólidos.
*
a un “puntero a t” produce una “variable de tipo t”. Entonces, ¿qué tenemos?
void *bar = whatever; char *foo = *(char **)bar;
bar
es una variable de tipo “puntero a anular”. foo
es una variable de tipo “puntero a char”. bar
to char**
lee la bar
variable y obtiene un valor de tipo “puntero a anular”. Ese valor se convierte luego en un valor de tipo “puntero a puntero a char”. foo
. ¿Tener sentido?
*(char**)bar;
Lanzar bar
a un puntero a puntero a char
y desreferencia, lo que resulta en un puntero a char
(es decir, un char*
).
Recuerda que los punteros son meramente indireccionales. Cuando eliminas la referencia de un puntero, “sueltas una estrella”, es decir:
char ***p = ...; p -> char*** *p -> char** **p -> char* ***p -> char
No sé qué tipo de bar
es sin el elenco, pero aquí va:
bar
se convierte en un puntero a un puntero a un char
.
El *
antes de (char **)
está “anulando la referencia” del valor a su derecha. En este caso, está devolviendo el puntero char *
mantenido en el puntero de ubicación a por la bar
.
El resultado de la “desreferenciación” es un char *
puntero a un carácter, que se asigna a la variable foo
del mismo tipo.