My function prototype is
int** rotate(int **arr, int row, int col, int fl);
where arr is the two dimensional array, row<
A pointer to a pointer is different from a pointer to an array. Array-to-pointer decaying can only happen on the left-most side (e.g. int [3][20] to int (*)[20]).
Change your function declaration to
int** rotate(int (*arr)[20], int row, int col, int fl);
or more obviously,
int** rotate(int arr[][20], int row, int col, int fl);
Note you have to fix the size at compile-time.