Bienvenidos sean a este post, hoy si que veremos un salseo tremendo.
Hasta ahora hemos visto que los apuntadores apuntan, valga la redundancia, a una variable donde principalmente nos manejamos con tipos de datos primitivos pero podemos usarlo para tipos de datos generados por nosotros? por supuesto dado que como comentamos en este post todo tiene una direccion de memoria y podemos apuntar a ella, y los tipos de datos de struct son basicamente ubicaciones de memoria donde esta almacenado toda la estructura de estas colecciones, recuerden que siempre podemos acceder a los elementos de esta estructura mediante el identificador y el punto seguido del dato que queremos obtener, por lo tanto para crear un apuntador a este tipo de estructura es similar a una variable, primero definimos al struct y luego creamos el apuntador a este, para entenderlo vamos a crear un ejemplo simple, para ello deben generar un nuevo archivo llamado ejemplo14.c y le agregaremos el siguiente codigo:
ejemplo14.c
#include <stdio.h>
typedef struct {
int dia;
int mes;
int anyo;
} Fecha;
int main()
{
Fecha aniversario = {22,10,1976};
printf("Fecha: %i/%i/%i\n",
aniversario.dia,
aniversario.mes,
aniversario.anyo);
return 0;
}
En este codigo primero definiremos un struct por medio de typedef para facilitar la creacion de objetos, en este caso no le pasamos un identificador despues del struct porque sera asignado con el alias del typedef, por otro lado tenemos tres variables internamente para almacenar los datos de una fecha, en el main crearemos un objeto de este tipo de struct y le pasaremos los tres datos para asignarlos a las variables del struct, por ultimo mostraremos los tres valores, con esto comentado podemos pasar a compilarlo y ver su salida:
tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo14
Fecha: 22/10/1976
tinchicus@dbn001vrt:~/lenguajes/C$
Con esto ya tenemos el codigo base, ahora pasemos a agregar los apuntadores y un par de temas mas, modifiquen el codigo de la siguiente manera:
#include <stdio.h>
typedef struct {
int dia;
int mes;
int anyo;
} Fecha;
void mostrar_fecha(Fecha* a_fecha)
{
printf("Fecha: %i/%i/%i\n",
a_fecha->dia,
a_fecha->mes,
(*a_fecha).anyo);
}
int main()
{
Fecha aniversario = {22,10,1976};
Fecha* a_aniversario = &aniversario;
mostrar_fecha(a_aniversario);
return 0;
}
En este caso agregamos una nueva funcion donde recibira un apuntaddor del tipo Fecha, luego lo mostraremos en pantalla, para ello observen el detalle que tenemos dos formas de obtener la informacion, para ello podemos usar el operador -> o bien desreferenciarlo y junto a unos parentesis para utilizar el punto seguido de la variable, ninguno es mejor que otro y tenemos las dos formas que hacen exactamente lo mismo, por ultimo en el main primero agregamos un apuntador del tipo Fecha y le asignamos la direccion del objeto aniversario, y por ultimo llamamos a la funcion anterior y le enviamos el nuevo apuntador, compilemos y deberian obtener la misma salida, ahora volvemos a tomar el codigo anterior y vamos a modificarlo de la siguiente manera:
#include <stdio.h>
typedef struct {
int dia;
int mes;
int anyo;
} Fecha;
void mostrar_fecha(Fecha* a_fecha)
{
printf("Fecha: %i/%i/%i\n",
a_fecha->dia,
a_fecha->mes,
(*a_fecha).anyo);
}
void cambiar_fecha(Fecha* a_fecha, int d, int m, int a)
{
(*a_fecha).dia = d;
(*a_fecha).mes = m;
a_fecha->anyo = a;
}
int main()
{
Fecha aniversario = {22,10,1976};
Fecha* a_aniversario = &aniversario;
mostrar_fecha(a_aniversario);
cambiar_fecha(a_aniversario, 13, 11, 2004);
mostrar_fecha(a_aniversario);
return 0;
}
En este caso agregamos una nueva funcion la cual se encargara de modiifcar los datos del apuntador, para ello volveremos a usar a void porque no devolveremos datos, el primer argumento sera un apuntador del tipo del struct y luego recibira tres valores de tipo int para el dia, mes y año respectivamente, observen que para poder asignar valores es de la misma forma que usamos para desreferenciarlo pero con el operador de asignacion le establecemos el valor, pasando cada valor que recibimos para cada variable correspondiente, por ultimo modificamos el main para llamar a esta funcion con el apuntador y los nuevos y finalmente mostrar la nueva fecha, compilemos y veamos como es su salida:
tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo14
Fecha: 22/10/1976
Fecha: 13/11/2004
tinchicus@dbn001vrt:~/lenguajes/C$
Con esto hemos complettado todas las formas de poder usar apuntadores con struct, a su vez como poder desreferenciarlo ya sea para recuperar los datos a donde apuntamos o para asignar nuevos valores, por ultimo no es necesario que utilicemos el apuntador porque al igual que los apuntadores de las variables podemos pasar la direccion de memoria y listo, tomemos el codigo anterior y modifiquenlo de la siguiente manera:
ejemplo14.c
#include <stdio.h>
typedef struct {
int dia;
int mes;
int anyo;
} Fecha;
void mostrar_fecha(Fecha* a_fecha)
{
printf("Fecha: %i/%i/%i\n",
a_fecha->dia,
a_fecha->mes,
(*a_fecha).anyo);
}
void cambiar_fecha(Fecha* a_fecha, int d, int m, int a)
{
(*a_fecha).dia = d;
(*a_fecha).mes = m;
a_fecha->anyo = a;
}
int main()
{
Fecha aniversario = {22,10,1976};
mostrar_fecha(&aniversario);
cambiar_fecha(&aniversario, 13, 11, 2004);
mostrar_fecha(&aniversario);
return 0;
}
Este codigo es igual al anterior pero eliminamos el apuntador del struct y le pasamos la direccion de memoria directamente, si lo compilan deberan tener la misma salida que vimos por ultima vez.
En resumen, hoy hemos visto como usar apuntadorres con struct, como podemos aplicarlo, como se desreferencia las variables del struct, ya sea para recuperar la informacion de las mismas o asignar nuevos valores, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
