Estructuras como punteros
No entiendo el siguiente texto que voy a poner si pudieran explicarmelo poniendo //comentarios al lado
me seria de gran ayuda:
2.2.4 Punteros a estructuras.
La declaración de una variable de tipo puntero a estructura se lleva a cabo de forma análoga a la estudiada para otros tipos de datos, es decir:
struct tipo_estructura *puntero;
Los operadores * y & se usan del mismo modo con los punteros a estructuras.
Ejemplo 19: Declaración y uso de una variable de tipo puntero a estructura.
struct datos
{
int x;
char y;
float s;
};
void main()
{
struct datos v, *p;
p = &v; //no se lo que hace
v.x = 23; //
v.y = ‘Z’; //
(*p).s = 2.55; //no se lo que hace /* El operador . tiene mayor prioridad que *, de ahí los paréntesis */
}
El acceso a un campo de una estructura apuntada por un puntero es una operación bastante común. Esta acción puede simplificarse usando el operador ->, sin escribir el operador *. Es decir, las dos siguientes instrucciones son equivalentes:
(*p).s = 2.55; //
p->s = 2.55; //
Es importante resaltar la importancia del uso de punteros a estructuras, ya que esta combinación es la utilizada para implementar las estructuras de datos dinámicas (listas, árboles, grafos, etc.).
A ver si puedo resolver alguna de tus dudas:
La declaración de un punero a estructura es igual que la de un puntero a cualquier otro tipo. Al fin y al cabo, un puntero es una variable que contiene una dirección, y la declaración genérica de un puntero es:
tipo *nombre_puntero;
y el empleo de * y & es el mismo.
Siguiendo el ejemplo que has puesto:
p = &v;
significa "Asigna a la variable p la dirección de la variable v".
v.x = 23;
significa: "Asigna el valor 23 al elemento x de la estructura v".
v.y = 'Z';
significa "Asigna el valor 'Z' al elemento y de la estructura v".
(*p).s = 2.55;
significa "Asigna el valor 2.55 al elemento s de la estructura apuntada por p" (es decir, a la estructura cuya dirección está en p).
Esta última asignación es lo mismo que poner
p->s = 2.55;
es decir, (*p).s equivale a p->s
Vale cualquiera de las dos, pero es menos confusa la segunda.
Efectivamente, tiene precedencia * sobre . es decir, *p.s significa "lo apuntado por el elemento s de la estructura p", lo que supondría que p no se habría declarado como puntero y s sí. El empleo de -> es para evitar ambigüedades.
Sobre el último comentario, es así: El empleo de punteros es necesario en cualquier programa C con un mínimo de envergadura, por lo que es vital entender su manejo.
Para cualquier otra consulta, ya sabes dónde estamos.
Saludos,