float ***M;
**M=(float *)malloc(sizeof(float)*i);
for(j=0;j<i;j++)
{
 *M[j]=(float *)malloc(sizeof(float)*3);
 for(k=0;k<d[j].numero_anyo;k++)
  M[j][k]=(float*)malloc(sizeof(float)*5);
}
i es la cantidad de alumnos
asi obtendrias una una matriz de M[3][5]
si fuesen 10 alumnos la matriz seria M[10][3][5]
espero que me entiendas, pones los * donde estan los que te mando yo....
espero que te sirva 
Gracias por tu ayuda eres un cielo.
Me está sirviendo de mucho.
Saludos Mercedes 
 Hola aqui estoy de nuevo, he tardado en contestarte, porque he estado muy liada con los examenes, veras aqui tengo el codigo entero de todo lo que tu me dijiste, pero no me compila bien.Por favor, si puedes ayudarme, necesito esta practica, para mi examen, tengo que comprenderla bien, y saberla hacer, y estoy super apurada.Porque me resulta de muy dificil comprension.
Gracias por todo.
Saludos Mercedes
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
struct alumno
{
  char DNI[10];
  char nombre[25];
  char apellidos[50];
  int numero_agno;  
 }; 
 typedef struct alumno DATOSALUMNO;  
main()
{
FILE *fp;
FILE *ficbin;
DATOSALUMNO *d;
char car;
char dni[10];
int i,j,k;
char nombre[25];
char apellidos[50];
int numero_agno;
if((fp=fopen("alumnos.txt", "r"))== NULL)
{
    printf("El fichero alumnos.txt no existe\n"); //abrimos el fichero texto para lectura
   getch();
 return -1;   
}
else
{
    i= 0;
    while(!feof(fp))//cuenta cuantos alumnos hay en el archivo
    {
        fscanf(fp, "%d %s", &j, dni); /*j sera para el numero identificativo*/
     i++; /*i cuenta las filas*/
     }
     d = (DATOSALUMNO*)malloc(sizeof(DATOSALUMNO)*i); // crea una estructura de
                                                  //tipo  puntero
                                                  //para guardar los alumnos        
     fseek(fp, 0, SEEK_SET); //posiciona el puntero
     for(j=0; j<i; j++) //inicializa la estructura a 0
     {
          d[j].DNI[0] = '\0';
          d[j].nombre[0] = '\0';
          d[j].apellidos[0] = '\0';
          d[j].numero_agno = '\0';
     }
     i = 0; /*cuenta las filas*/
     while(!feof(fp)) //coloca los datos en la estructura
     {
         fscanf(fp, "%d %s", &j, d
.DNI);
         i++;     
     }
   fclose(fp);
         
  if((ficbin =fopen("alumnos.bin", "wb"))== NULL)
 {
    printf("El fichero no se puede crear\n"); //abrimos el fichero texto para lectura
   getch();
  return -1;
}
else
{
    for(j=0;j<i;j++)//pide los datos restantes
    {
        system("clear");
        fflush(stdin);
        printf("Datos del alumnos con DNI: %s\n\n",d[j].DNI);
        printf("Introduzca los Apellidos: ");
       gets(d[j].apellidos);
      fflush(stdin);
       printf("Introduzca el Nombre: ");
         gets(d[j].nombre);
      fflush(stdin);
         printf("Introduzca el Numero de años: ");
        scanf("%d",&d[j].numero_agno); 
        fflush(stdin);
    fwrite(&d, sizeof(DATOSALUMNO), 1, ficbin); /*guarda los datos en 
                                                  un archivo binario*/
     }
}
fclose(ficbin);
free(d);
}
float ***M;
**M=(float *)malloc(sizeof(float) *i);
(for j= 0; j<i; j++)
{
    *M[j] = (float)malloc(sizeof(float)*3);
    for(k=0; k<d[j].numero_agno; k++)
    M[j][k]=(float*)malloc(sizeof(float)*5);
}
/*i es la cantidad de alumnos M[3][5]*/
/*M[5][2][3] seria la 4ºasignatura del 3º año del sexto alumno*/