Ciao,

non so se può esserti di aiuto ma ho pensato a questo:

in C le matrici sono memorizzate per righe in un array monodimensionale. Questo vuol dire che un elemento Aij di una matrice A[m][n] si può utilizzare anche con *(A+(i x n)+j).

Analogamente per le matrici 3D. Suppniamo A[k][m][n]: da A parte la prima sottomotracie, da (A+(m x n)) parte la seconda sottomatrice, da (A+(m x n x k)) parte la k-esima sottomotracie.

Volendo potresti usare un int * al quale assegnare ogni volta l'indirizzo di partenza.

Ad esempio (ma spero di non aver sparato solo cavoloate )
codice:
#include <stdio.h>

int main (void)
{
  int a[5][5][5], *b;
  int i,j,k;
  
  for(k=0;k<5;k++)
  {
    for(i=0;i<5;i++)
    {
      for(j=0;j<5;j++)
      	a[k][i][j]=j;
     }
  }
  
  for(k=0;k<5;k++)
  {
      b=(int*)(a)+(25*k);
      for(i=0;i<5;i++)
      {
	for(j=0;j<5;j++)
	  printf("%d ", *(b+(i*5)+j));
	printf("\n");
      }
      printf("\n\n");
      
  }
  
  return 0;
}