Tengo el siguiente código, pero no tengo ni idea, necesito entenderlo. Agradecería que alguien me lo explicase y tener los medios necesarios, porque lo único que hago es dar vueltas. Gracias
 
La cabecera es:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void AñadirAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos);
void MostrarAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos);
void GenerarFichero(char **nombre, int *edad, int **notas, int numeroAlumnos);
 
 
y el resto de código:
 
#include "cabecera.h"
 
void main(){
	char **nombre;
	int *años;
	int **notas;
	int numeroAlumnos=0;
	int fin=1;
	int opcion;
	while(fin==1){
		printf("1. Añadir alumno\n");
		printf("2. Mostrar alumno\n");
		printf("3. Generar Fichero\n");
		printf("4. Salir\n");
		printf("Elegir opcion\n");
		fflush(stdin);
		scanf("%i", &opcion);
		switch(opcion){
		case 1:
			printf("Introduce numero de alumnos:\n");
			fflush(stdin);
			scanf("%i", &numeroAlumnos);
			nombre=(char **)malloc(numeroAlumnos*sizeof(char*));
			años=(int *)malloc(numeroAlumnos*sizeof(int));
			notas=(int **)malloc(numeroAlumnos*sizeof(int *));
			for(int i=0;i<numeroAlumnos;i++){
				nombre[i]=(char *)malloc(30*sizeof(char));
				notas[i]=(int *)malloc(3*sizeof(int));
			}
			AñadirAlumno(nombre, años, notas, numeroAlumnos);
			break;
		case 2:
			if(numeroAlumnos!=0){
				MostrarAlumno(nombre, años, notas, numeroAlumnos);
			}else{
				printf("No existen alumnos\n");
			}
			break;
		case 3:
			GenerarFichero(nombre, años, notas, numeroAlumnos);
			break;
		case 4:
			fin=0;
			break;
		}
		free(años);
		for(int i=0;i<numeroAlumnos;i++){
			free(nombres[i]);
			free(notas[i]);
		}
		free(nombres);
		free(notas);
	}
}
void AñadirAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos){
	for(int i=0;i<numeroAlumnos;i++){
		printf("Introduce nombre\n");
		fflush(stdin);
		gets(nombre[i]);
		printf("Introduce la edad\n");
		fflush(stdin);
		scanf("%i", &edad[i]);
		for(int j=0;j<3;j++){
			printf("Introduce las nota %i", j+1);
			fflush(stdin);
			scanf("%i", ¬as[i][j]);
		}
		/*printf("Introduce las nota 2");
		fflush(stdin);
		scanf("%i", ¬as[i][1]);
		printf("Introduce las nota 3");
		fflush(stdin);
		scanf("%i", ¬as[i][2]);*/
	}
}
void MostrarAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos){
	for(int i=0;i<numeroAlumnos;i++){
			printf("Nombre: %s\n", nombre[i]);
			printf("Edad: %i\n", edad[i]);
			printf("Nota 1: %i Nota 2: %i Nota 3: %i\n", notas[i][0],notas[i][1],notas[i][2]);
		}
}
void GenerarFichero(char **nombre, int *edad, int **notas, int numeroAlumnos){
	FILE *fichero;
	fichero=fopen("Texto.txt","w");
	if(fichero!=NULL){
		for(int i=0;i<numeroAlumnos;i++){
				fprintf(fichero,"Nombre: %s\n", nombre[i]);
				fprintf(fichero,"Edad: %i\n", edad[i]);
				fprintf(fichero,"Nota 1: %i Nota 2: %i Nota 3: %i\n", notas[i][0],notas[i][1],notas[i][2]);
				fprintf(fichero,"Nota media: %f", ((float)notas[i][0]+(float)notas[i][1]+(float)notas[i][2])/3);
				fprintf(fichero,"-------------------------------------------------");
 
			}
		fclose(fichero);
	}
	else{
		printf("No se ha creado correctamente el fichero\n");
}
} 
  
 



