えーと、関数の仮引数として書いたとき、
typedef double p[N]; とすると、
double a[N][N]とdouble a[][N]とp *aが全部同じだというのは
わかってる?