#include <stdio.h>
#include <stdlib.h> //para punteros, atoi, memoria dinamica...
typedef struct {
int id;
int edad;
} Persona;
typedef struct {
int alumnos;
Persona *personas;
} Clase;
void modifica(int *puntero, int recibido) {
*puntero = recibido;
}
void modificarPersona(Persona *punteroPersona, int id, int edad) { //Para acceder a los contenidos de una estructura con PUNTERO se usa ->
punteroPersona->id = id;
punteroPersona->edad = edad;
(*punteroPersona).id = 80; //otra forma de acceder a los contenidos de una estructura con PUNTERO
(*punteroPersona).edad = edad;
}
void modificarPersona2(Persona **punteroPersona, int id, int edad) { //Para acceder a los contenidos de una estructura con PUNTERO se usa ->
(*punteroPersona)->id = id;
(*punteroPersona)->edad = edad;
(**punteroPersona).id = 80; //otra forma de acceder a los contenidos de una estructura con PUNTERO (doble puntero)
(**punteroPersona).edad = edad;
}
void funcGente(Clase *punteroClase) { // [accediendo] tambien es una forma de dereferenciar! (acceder al contenido de un puntero) ( -> | (*). | [] )
punteroClase->alumnos = 2;
punteroClase->personas[0].id = 1;
punteroClase->personas[0].edad = 20;
punteroClase->personas[1].id = 2;
punteroClase->personas[1].edad = 30;
(*punteroClase).personas[1].edad = 700;
}
void funcGente2(Clase **punteroClase) {
(*punteroClase)->alumnos = 2;
(*punteroClase)->personas[0].id = 30;
(*punteroClase)->personas[0].edad = 30;
(*punteroClase)->personas[1].id = 600;
(*punteroClase)->personas[1].edad = 600;
(**punteroClase).personas[1].edad = 1000;
}
int main() {
int patata = 6;
int *puntero;
Persona *punteroPersona = NULL; //que en una estructura el propio nombre ya es un puntero! si ponemos * tenemos doble puntero :)
Clase *punteroClase = NULL;
puntero = &patata;
printf("Direccion de memoria de patata: %p\n", &patata);
printf("Direccion de memoria de puntero: %p\n", &puntero);
printf("Direccion de memoria de contenido de puntero: %p\n", &(*puntero));
printf("Valor de patata: %d\n", patata);
printf("Valor de puntero: %d\n", *puntero);
printf("Valor de contenido de puntero: %d\n", *puntero);
patata = 8;
*puntero = 10;
printf("Valor de patata: %d\n", patata);
printf("Valor de puntero: %d\n", *puntero);
printf("Valor de contenido de puntero: %d\n", *puntero);
modifica(&patata, 500);
printf("Valor de patata: %d\n", patata);
modifica(puntero, 1000);
printf("Valor de patata: %d\n", patata);
punteroPersona = (Persona *) malloc(sizeof(Persona)*1);
modificarPersona(punteroPersona, 1, 20);
printf("Valor de id: %d\n", punteroPersona->id);
printf("Valor de edad: %d\n", (*punteroPersona).edad);
modificarPersona2(&punteroPersona, 99, 2000);
printf("Valor de id: %d\n", punteroPersona->id);
printf("Valor de edad: %d\n", (*punteroPersona).edad);
punteroClase = (Clase *) malloc(sizeof(Clase)*1);
(*punteroClase).personas = (Persona *) malloc(sizeof(Persona)*2);
punteroClase->personas = (Persona *) malloc(sizeof(Persona)*2);
funcGente(punteroClase);
printf("Valor de alumnos: %d", punteroClase->alumnos);
printf("Valor de id: %d", punteroClase->personas[0].id);
printf("Valor de edad: %d", punteroClase->personas[0].edad);
printf("Valor de id: %d", punteroClase->personas[1].id);
printf("Valor de edad: %d\n", punteroClase->personas[1].edad);
funcGente2(&punteroClase);
printf("Valor de alumnos: %d", punteroClase->alumnos);
printf("Valor de id: %d", punteroClase->personas[0].id);
printf("Valor de edad: %d", punteroClase->personas[0].edad);
printf("Valor de id: %d", punteroClase->personas[1].id);
printf("Valor de edad: %d", punteroClase->personas[1].edad);
return 0;
}