AnteriorPosterior

9.8. Punteros y estructuras

  Curso: Fundamentos de programación en C, por Nacho Cabanes

9.8. Punteros y estructuras

Igual que creamos punteros a cualquier tipo de datos básico, le reservamos memoria con “malloc” cuando necesitamos usarlo y lo liberamos con “free” cuando terminamos de utilizarlo, lo mismo podemos hacer si se trata de un tipo de datos no tan sencillo, como un “struct”.

Eso sí, la forma de acceder a los datos en un struct cambiará ligeramente. Para un dato que sea un número entero, ya sabemos que lo declararíamos con int *n y cambiaríamos su valor haciendo algo como *n=2, de modo que para un struct podríamos esperar que se hiciera algo como *persona.edad = 20. Pero esa no es la sintaxis correcta: deberemos utilizar el nombre de la variable y el del campo, con una flecha (->) entre medias, así: persona->edad = 20. Vamos a verlo con un ejemplo:

/*---------------------------*/
/*  Ejemplo en C nº 79:      */
/*  C079.C                   */
/*                           */
/*  Punteros y structs       */
/*                           */
/*  Curso de C,              */
/*    Nacho Cabanes          */
/*---------------------------*/
 
#include <stdio.h>
 
int main() {    
   /* Primero definimos nuestro tipo de datos */    
   struct datosPersona {
     char nombre[30];
     char email[25];
     int edad;
   };
 
   /* La primera persona será estática */
   struct datosPersona persona1;
   /* La segunda será dinámica */
   struct datosPersona *persona2;
 
   /* Damos valores a la persona estática */
   strcpy(persona1.nombre, "Juan");
   strcpy(persona1.email, "j@j.j");
   persona1.edad = 20;
 
   /* Ahora a la dinámica */
   persona2 = (struct datosPersona*)
     malloc (sizeof(struct datosPersona));
   strcpy(persona2->nombre, "Pedro");
   strcpy(persona2->email, "p@p.p");
   persona2->edad = 21;
 
   /* Mostramos los datos y liberamos la memoria */
   printf("Primera persona: %s, %s, con edad %d\n",
     persona1.nombre, persona1.email, persona1.edad);
   printf("Segunda persona: %s, %s, con edad %d\n",
     persona2->nombre, persona2->email, persona2->edad);
   free(persona2);
 
   return 0;   
}
 

Ejercicio propuesto: mejorar la versión de la agenda que leía todos los datos al principio de la ejecución y guardaba todos los datos cuando terminábamos su uso (apartado 6.4). Esta nueva versión deberá estar preparada para manejar hasta 1000 fichas, pero sólo reservará espacio para las que realmente sean necesarias.

Actualizado el: 27-07-2014 14:17

AnteriorPosterior