int CVode(void *cvode_mem, realtype tout, N_Vector yout, realtype *t, int itask);
(NORMAL or ONE_STEP) tout = desired output time. yout is the output vector

//Given
N_Vector v; //This is a pointer
real *v_data;
real r;
integer v_len;
integer i;

//User defined/alloc data
N_Vector N_VMake(integertype n, realtype *v_data, M_Env machEnv);
void N_VDispose(N_Vector v);

//Accessors
N_VGetData(v); //pointer to data storage
N_VSetData(realtype *v_data, N_Vector v)
N_VLENGTH;  //Set/Get the length of the vector
N_VIth(v,i);//Like v[i]

//Manually
v = (N_Vector) malloc(sizeof(*v)); v->data = v_data; v->length = v_len;
free(v)
v->data;
v->length;
(v->data)[i]

//CVode alloc
v = N_VNew(int n, NULL)
N_VFree(v)

//CVodeMalloc
static void *cvode_mem;
cvode_mem = CVodeMalloc(N, f, t0, y0,lmm, iter, itol, &reltol, &abstol, f_data, errfp, optIn, iopt, ropt, NULL)
N = Problem Size
t0, y0 = Initial conditions
lmm = Liner Multistep method (Adams, BRF)
itol = (SS) scale relative and absolute tolerances | (SV) scalar relative and vector (N_Vactor) absolute tolerances
f_data = pointer to user data;
errfp = file pointer for error, NULL = standard output
iopt, ropt = real and integer optional inputs
**y0 is copied to zn[0]

For code see cvode.c L#495 ,cvode.h L#564


void f_GPC(long N, realtype time, N_Vector y, N_Vector ydot, void *f_data) { 
f(N, tn, zn[0], ftemp, f_data);
zn[0] = y
ftemp = ydot

#define zn     (cv_mem->cv_zn) 
#define ftemp  (cv_mem->cv_ftemp)
first run
f(N, tn, zn[0], zn[1], f_data); 

Must redo pointers everytime;