Un puntero es el nombre que recibe UNA VARIABLE que guarda una dirección de memoria.
¿Para qué los usas?, bueno, vos viste que en la memoria de la máquina cada byte tiene una dirección y que esa dirección es un número: 1, 2, ..., n. Supongamos que hay una tabla que me interesa leer en la dirección 0. ¿Pero qué pasa?, yo cuando cargo mi programa no sé si lo va ha hacer justo en esa dirección, pensemos que incluso antes se carga el sistema operativo que seguramente ya habrá ocupado esa dirección por ser la primera libre. Existe por eso un sistema que me permite leer cualquier lugar de memoria y son justamente los punteros.
Un puntero hace referencia a un lugar de memoria (guarda una dirección, por ejemplo la 0), pero no sólo eso, si no que tiene la capacidad de "desreferenciarse" y devolverme el byte que está en la dirección de memoria a la que estaba apuntando. En en problema anterior, yo tendría que "apuntar" el puntero a la dirección 0 y "desreferenciarlo" para leer la información que se encuentra en esa dirección.
Ahora eso sí, leer byte por byte es embolante. Pascal permite definir punteros a estructuras y transferir (o leer) varios bytes a la vez.
Otro uso para que no se quejen los del foro que no digo EL PRINCIPAL USO DEL PUNTERO:
Con los punteros, vos podés ocupar y desocupar memoria en tiempo de ejecución y de esta forma poder implementar "arreglos dinámicos" llamados listas. En vez de definir un arreglo bestial, que seguro no sabés si siempre lo vas a llenar, podés ocupar la memoria a medida que la necesitas y desocuparla cuando ya no la uses.
Te hago un ejemplo cortito de algo sincillícimo en Pascal y la corto