Вы должны либо запомнить исходный адрес, либо знать, где вы находитесь (какой индекс), чтобы вы могли сделать резервную копию достаточно, чтобы найти начало.
Пример первого (пока игнорируя, что во всехв этих случаях вы печатаете неинициализированные значения, это, в конце концов, надуманный пример):
int *ip = malloc (10 * sizeof (*ip));
int *origIp = ip;
printf ("%d\n", *ip++); // print and advance
printf ("%d\n", *ip++); // print and advance
ip = origIp; free (ip); // or just free (origIp) if you wish.
для второго:
int *ip = malloc (10 * sizeof (*ip));
int idx = 0;
printf ("%d\n", *ip++); idx++; // print and advance
printf ("%d\n", *ip++); idx++; // print and advance
ip -= idx; free (ip);
В качестве альтернативы выможно просто сохранить указатель как есть и использовать индексирование массива для обработки массива, что-то вроде:
int *ip = malloc (10 * sizeof (*ip));
int idx = 0;
printf ("%d\n", ip[idx++]); // print and advance
printf ("%d\n", ip[idx++]); // print and advance
free (ip);
Большинство современных компиляторов в любом случае дадут вам один и тот же код под обложками.