関数の引数を構造体にまとめて、ポインタ渡しすればいいだろー。

void forloop(int i, void (*func)(int,void *), void *p)
{
 if (i == 0) return;
 func(i, p);
 forloop(i-1, func, p);
}

main()
{
 struct datatype data;
 forloop(10,func, &data);
}