In most contexts, an expression of array type will be converted to an expression of pointer type; this means when you pass an array expression to a function as a parameter, what the function will receive is a pointer. The exceptions to this rule are when the array expression is an operand of the sizeof or unary & operators, or is a string literal being used to initialize an array in a declaration.
In the context of a function parameter declaration, T a[] and T a[N] are treated the same as T *a; all three declare a as a pointer to T, not as an array of T.
So, going by your declarations
float state[6];
float err[6][6];
the type of the expression state is "6-element array of float", which in most contexts will be converted to "pointer to float", or float *. Similarly, the type of the expression err is "6-element array of 6-element array of float", which will be converted to "pointer to 6-element array of float", or float (*)[6].
The type of the expression &state is "pointer to 6-element array of float", or float (*)[6], and the type of &err is "pointer to 6-element array of 6-element array of float", or float (*)[6][6].
So, if the call to func is
func(&state, &err);
then the prototype must be
void func(float (*state)[6], float (*err)[6][6])
and you would need to explicitly dereference state and err before applying any subscript:
(*state)[i] = ...;
(*err)[i][j] = ...;
If the call is
func(state, err);
then the prototype must be
void func (float *state, float (*err)[6])
and you would not need to explicitly dereference either state or err:
state[i] = ...;
err[i][j] = ...;
So, which do you use? Personally, I'd go with the second option; it's a little cleaner.