A fordított kiíráshoz el kell tárolnunk a megadott egész számokat. Viszont nem deklarálhatunk tömböt, hiszen nem tudjuk a méretét.
Erre ad megoldást a dinamikus memóriakezelés. Ilyenkor az operációs rendszertől kérünk memóriát. Például n darab int típusú változónak az alábbi módon kérhetünk helyet:
int *ptr;
...
ptr = malloc(n*sizeof(int));
Használat után fel kell szabadítanunk (vissza kell adnunk az operációs rendszernek) a memóriát:
free(ptr);
A kapott memóriaterületet kétféleképpen használhatjuk fel, ezeket az alábbi ábra mutatja:
Az egyik a hagyományos módszer: *ptr az első elem, *(ptr+1) a második, és így tovább. A C nyelv azonban kifejezetten erre a helyzetre biztosít egy kényelmesebb megoldást. Az egyes elemeket írhatjuk ptr[0], ptr[1], stb. formában, ahogyan a tömböket használjuk. Vagyis elmondhatjuk, hogy:
ptr[i] = *(ptr+i)
Ez a C nyelv egyik nagyon fontos összefüggése, amely nem csak akkor igaz, ha pointeren keresztül használjuk az általa mutatott területet, hanem akkor is, ha van egy tömbünk (int a[3];), és annak nevét szeretnénk pointerként használni: *(a+1)=2;.
Fontos különbség, hogy míg a tömbhöz tartozó memóriahelyről a fordító gondoskodik (ezért is kell megadnunk a méretét fordítás előtt), a pointer esetén csak a pointer helyéről gondoskodik a fordító, a mutatott területről nem, azt nekünk kell lefoglalnunk a fent bemutatott módon.
Ezek után a program a következőképpen implementálható:
#include<stdio.h>
#include<stdlib.h>
int main()
{
unsigned int n, i;
int *ptr;
printf("n= ");
scanf("%u",&n);
ptr = malloc(n*sizeof(int));
for(i=0; i<n;i++)
{
scanf("%d", &ptr[i]);
}
for(i=0; i<n;i++)
{
printf("%d ",ptr[n-i-1]);
}
free(ptr);
return 0;
}