Untitled
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 = № 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; }