Estructuras como punteros

nestor1991ag
02 de Mayo del 2010
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.).

Capitan Kirk
04 de Mayo del 2010
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,