Untitled
unknown
plain_text
3 years ago
3.1 kB
7
Indexable
#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;
}Editor is loading...