Uso del operador de flecha (->) en C
Estoy leyendo un libro llamado "Aprenda usted mismo C en 21 días" (ya aprendí Java y C#, así que estoy avanzando a un ritmo mucho más rápido). Estaba leyendo el capítulo sobre punteros y apareció el operador->
(flecha) sin explicación. Creo que se usa para llamar a miembros y funciones (como el equivalente del operador (punto), pero para punteros en lugar de miembros). Pero no estoy del todo seguro..
¿Podría obtener una explicación y un ejemplo de código?
foo->bar
es equivalente a (*foo).bar
, es decir, obtiene el miembro llamado bar
desde la estructura a la que foo
apunta.
Si eso es.
Es solo la versión punto cuando desea acceder a elementos de una estructura/clase que es un puntero en lugar de una referencia.
struct foo
{
int x;
float y;
};
struct foo var;
struct foo* pvar;
pvar = malloc(sizeof(struct foo));
var.x = 5;
(&var)->y = 14.3;
pvar->y = 22.4;
(*pvar).x = 6;
¡Eso es todo!
Simplemente agregaría a las respuestas el "¿por qué?".
.
es un operador de acceso a miembros estándar que tiene mayor prioridad que *
el operador de puntero.
Cuando intentas acceder a las partes internas de una estructura y la escribiste, *foo.bar
el compilador pensaría que quiere un elemento 'barra' de 'foo' (que es una dirección en la memoria) y obviamente esa mera dirección no tiene ningún miembro.
Por lo tanto, debe pedirle al compilador que primero elimine la referencia (*foo)
y luego acceda al elemento miembro: (*foo).bar
, lo cual es un poco complicado de escribir, por lo que la buena gente ha creado una versión abreviada: foo->bar
que es una especie de acceso a miembros mediante un operador de puntero.
a->b
es simplemente la abreviatura de (*a).b
en todos los sentidos (lo mismo para funciones: a->b()
es la abreviatura de (*a).b()
).
foo->bar
es sólo una abreviatura de (*foo).bar
. Eso es todo al respecto.