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,
