lectura de

Cuando tenemos códigos donde una estructura se define como parte de otra, aveces es mas cómodo y bonito hacer un puntero a la subestructura en vez de llamarla por todos los parametros que necesita.

¿de qué estoy hablando? de esto:

Tengo una estructura Mascota que tiene un nombre y una edad.
Tengo una estructura Persona que tiene un nombre una edad y una Mascota.

es decir tengo una estructura dentro de otra.

como sabemos, para utilizar las propiedades de una estructura lo hacemos con: Supongamos que tengo la estructura persona (de arriba), y yo cree la persona juampi.

ahora decimos;

juampi.edad = 20;

y para el nombre, como es un string, usamos strcpy o sprintf.

sprintf(juampi.nombre, "Juampi");

hasta aqui todo bien, facil y bonito.

ahora vamos a darle un nombre y una edad a la mascota de juampi. Utilizando la misma logica anterior seria:

juampi.pet.edad = 2;
sprintf(juampi.pet.nombre, "Boo");

Vemos que mientras mas subestructuras, mas tenemos que escribir para llegar a cierta propiedad, lo que puede volverse muy feo…

menos mal que en C existen los punteros!!

vamos a hacer un puntero a la direccion de memoria de la mascota de juampi asi:

mascota *puntero;
puntero = &juampi.pet;

Listo, ahora para utilizar las propiedades de la mascota de juampi, simplemente hacemos esto:

puntero->edad = 20;
sprintf(puntero->nombre, "Boo");

se ve bonito ahora con una flechita.

ahora todo escrito en C


#include <stdio.h>

int main(int argc, char *argv[])
{
  typedef struct{
    int edad;
    char nombre[30+1];
  }mascota;
  
  typedef struct{
    int edad;
    char nombre[30+1];
    mascota pet;
  }persona;
  
  /* ahora creamos una persona... */
  persona juampi;
  
  /* hacemos un puntero para la mascota de la persona juampi */
  mascota *pet;
  
  /* Ahora le decimos al puntero pet, que apunte a la direccion
     de memoria de la mascota de la persona juampi */ 
  pet = &juampi.pet;
  
  /* listo, ahora le damos un nombre y una edad a la persona */
  juampi.edad = 20; 
  sprintf(juampi.nombre, "Juampi");
  
  /* Ahora la mascota */
  pet->edad = 2;
  sprintf(pet->nombre, "Boo");
  
  /* mostremos los valores */
  printf("Nombre persona: %s\n", juampi.nombre);
  printf("Edad persona: %d\n", juampi.edad);
  
  printf("Nombre mascota: %s\n", pet->nombre);
  printf("Edad mascota: %d\n", pet->edad);
  
  return 0;
}

Ejemplo2. Arreglo de personas, con arreglo de punteros a las mascotas de cada persona.


#include <stdio.h>

int main(int argc, char *argv[])
{
  typedef struct{
    int edad;
    char nombre[30+1];
  }mascota;
  
  typedef struct{
    int edad;
    char nombre[30+1];
    mascota pet;
  }persona;

  int i;
  
  /* Creamos un arreglo de tipo persona de tamaño 5 */
  persona gente[5];
  
  /* Creamos un arreglo de punteros de tipo mascota y de tamaño 5 */
  mascota *mascotas[5];
  
  /* hacemos un for que relacione a cada mascota con su dueño */
  for(i=0; i<5; i++)
    mascotas[i] = &gente[i].pet;
    
  /* Ahora le damos una edad a las personas */
  for(i=0; i<5; i++)
    gente[i].edad = i+20;
    
  /* Un nombre... en verdad sera al azar */
  for(i=0; i<5; i++)
    sprintf(gente[i].nombre, "al azar");
    
  
  /* ahora las mascotas... */
  /* edades */
  for(i=0; i<5; i++)
    mascotas[i]->edad = 2+i;
    
  /* Nombres */
  for(i=0; i<5; i++)
    sprintf(mascotas[i]->nombre, "Boo");
    
  
  /* Ahora mostramos toda la informacion */
  for(i=0; i<5; i++){
    printf("Nombre persona%d: %s\n", i+1, gente[i].nombre);
    printf("Edad persona%d: %d\n", i+1, gente[i].edad);
    printf("Nombre Mascota de la persona%d: %s\n", i+1, mascotas[i]->nombre);
    printf("Edad Mascota de la persona%d: %d\n", i+1, mascotas[i]->edad);
    printf("-------------------------------------\n");
  }
  
  return 0;
}

Ejercicio…
¿puedo utilizar la flechita para una estructura simple asi:

juampi->edad = 20;

en vez de

juampi.edad = 20;

? ¿Cómo?

Blog Logo

Juan Pablo Escalona G.


Publicado el

comments powered by Disqus
Image

JPEG {codes}

Códigos azarosos en múltiples lenguajes, JavaScript, Ruby, C, Python. Bienvenidos aquellos que quieran aprender.

Volver al inicio