Es para acceder a la posición (x,y) de la matriz.
Suponiendo x=3, y=4 (3 columnas, 4 filas), el malloc reserva espacio para 12 flotantes y guarda un puntero a ese espacio en p->datos.
Supongamos ahora que quiero acceder a la columna 2, fila 3 (x=1, y=2):
a.datos -> la matriz
x -> 1: mueve el puntero al primer lugar
y*a.ancho -> y*cantidad de columnas: se desplaza sobre las filas
Veamos paso a paso. Cada [] es una "casilla" de la matriz, de las reservadas por malloc. Agregué las | para ver mejor las casillas que corresponden a cada fila. ^ indica la "casilla" a la que se apunta luego de la suma
Código:
a.datos [][][] | [][][] | [][][] | [][][]
^
+ x [][][] | [][][] | [][][] | [][][]
(1) ^
+ y*a.ancho [][][] | [][][] | [][][] | [][][]
(3*2=6) ^
Finalmente llego a la posición que necesito. el * al principio indica desreferenciar el puntero, y acceder al valor almacenado.
Saludos.