重要なルールっていうのを初めて知りましたので

「int *」と「double *」が違う型であるのと同様に「float *」と「float (*)[5]」は違う型である、というのが理解できていない気がする。

この意味がやっとわかりました int *はint aのポインタ double * はdouble a;のポインタ float * は float a;のポインタ
使い方は int *p; p=&a
それで配列はfloat *は1次元配列のfloat a[10]に対応;


二次元の場合
float (*)[n]

float a[10][5];
float (*p)[5];
p=a; それか p=&a[0];

たぶんあってます この考えであってると思います
自信あります
残るはキャストの(float *)を理解すれば解放されます