¿Recuerdas que dijimos que el apuntador almacena la dirección de una variable? Haré una correción y diré simplemente que almacena una dirección. ¿Por qué?, por que puede almacenar una dirección que no pertenezca a ninguna variable.
Los punteros son ideales para la asignación dinámica de memoria. En tiempo de ejecución puedes "crear" y "destruir" variables. En C puedes hacer algo como esto:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *dinamic; //Declaro un apuntador a entero
//Reservo un espacio de memoria del tamaño de un entero, si se consigue,
//dinamic apuntara a dicha dirección de memoria:
dinamic = (int *)malloc(sizeof(int));
*dinamic = 99; //Asigno a ese espacio de memoria el valor de 99
printf("El valor de lo que apunta dinamic es: %d", *dinamic); //Lo imprimo
free(dinamic); //Libero la memoria previamente reservada
getchar();
return(0);
} Aquí puedes encontrar un sencillo manual de C que habla de apuntadores, estructuras dinámicas, etc: