Yes, I believe both your points are correct. The interface should be:
real(c_double) function C_UsesFortranArray_maxval(ptr) &
bind(c,name="C_UsesFortranArray_maxval")
import c_ptr, c_double
type(c_ptr), intent(in), value :: ptr
end function
I will amend the snippet above.