Uso del operador de flecha (->) en C

Resuelto Mohit Deshpande asked hace 14 años • 12 respuestas

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?

Mohit Deshpande avatar Apr 04 '10 23:04 Mohit Deshpande
Aceptado

foo->bares equivalente a (*foo).bar, es decir, obtiene el miembro llamado bardesde la estructura a la que fooapunta.

sepp2k avatar Apr 04 '2010 16:04 sepp2k

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!

Jack avatar Apr 04 '2010 16:04 Jack

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.barel 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->barque es una especie de acceso a miembros mediante un operador de puntero.

Lukasz Matysiak avatar Oct 20 '2017 06:10 Lukasz Matysiak

a->bes simplemente la abreviatura de (*a).ben todos los sentidos (lo mismo para funciones: a->b()es la abreviatura de (*a).b()).

Peter Alexander avatar Apr 04 '2010 16:04 Peter Alexander

foo->bares sólo una abreviatura de (*foo).bar. Eso es todo al respecto.

Matti Virkkunen avatar Apr 04 '2010 16:04 Matti Virkkunen