Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
3.1 kB
0
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int nota;
}Notas;

typedef struct {
    char nombre[20];
    int edad;
    int asignaturas;
    Notas *notas;
}Persona;

typedef struct {
    int alumnos;
    Persona *personas;
}Clase;

void modifica(int *recibido, int valor) {

    *recibido = valor;

}

void funcionstruct(Clase *clase) {  //Si recibimos una estrucutra con puntero hay de dereferenciarla. Se puede hacer con: -> , (*...) , ...[x]
                                    // (*clase).alumnos
                                    // clase->alumnos
                                    // (*clase[0]).alumnos 

    clase->alumnos = 10;
    (*clase).alumnos = 2;

}

void funcgente(Clase **clase) {

    (*clase)->personas[0].edad = 20;
    strcpy((*clase)->personas[0].nombre, "Marta");

    (*clase)->personas[1].edad = 60;
    strcpy((*clase)->personas[1].nombre, "Alberto");

}

void funcgente2(Clase *clase) {

    strcpy(clase->personas[0].nombre, "Willy");
    strcpy((*clase).personas[1].nombre, "Miguel");

}

void funcnotas(Clase *clase) {

    clase->personas[0].notas[0].nota = 9;
    (*clase).personas[0].notas[1].nota = 10;

}

int main() {

    int *puntero = NULL;
    int numero = 10;

    Clase *clase = NULL;    //El nombre de la estrucuta YA es un puntero, podemos mandarlo sin tener el * recibiendolo con * en la funcion
                            //Si esta declarada como puntero y lo mandamos con & es un doble puntero **

    puntero = &numero;

    modifica(puntero, 230); //no podemos & porque puntero YA es un puntero (*) Un puntero es una direccion de memoria! Si mandamos con & estamos mandando un ** doble puntero
    printf("Valor de numero: %d\n", numero);
    printf("Valor de contenido de puntero: %d\n", *puntero);

    modifica(&numero, 400); //& significa mandar direccion! referencia
    printf("Valor de numero: %d\n", numero);
    printf("Valor de contenido de puntero: %d\n", *puntero);

    clase = (Clase *) malloc(sizeof(Clase)*1); //Por cada malloc un free! :)
    funcionstruct(clase);
    printf("Cantidad de alumnos: %d\n", clase->alumnos);


    clase->personas = (Persona *) malloc(sizeof(Persona)*clase->alumnos);
    funcgente(&clase);
    printf("Persona 1: %s, %d\n", clase[0].personas[0].nombre, clase->personas[0].edad);
    printf("Persona 2: %s, %d\n", (*clase).personas[1].nombre, (*clase).personas[1].edad);


    funcgente2(clase);
    printf("Persona 1: %s, %d\n", clase->personas[0].nombre, clase->personas[0].edad);
    printf("Persona 2: %s, %d\n", (*clase).personas[1].nombre, (*clase).personas[1].edad);


    (*clase).personas[0].asignaturas = 1;
    clase[0].personas[0].asignaturas = 2;
    (*clase).personas[0].notas = (Notas *) malloc(sizeof(Notas)*clase->personas[0].asignaturas);
    funcnotas(clase);
    printf("Nota 1: %d\n", clase->personas[0].notas[0].nota);
    printf("Nota 2: %d\n", (*clase).personas[0].notas[1].nota);


    for(int i = 0; i < clase->alumnos; i++) {
        free((*clase).personas[i].notas);
    }

    free((*clase).personas);
    free(clase);

    return 0;
}