En C, un puntero como bien dices, apunta a la direccion de una variable o una funcion tambien.
Tienen muchas aplicaciones, por comentar alguna, la comunicacion entre funciones, cuando una funcion ha de devolver varios resultados, no pdemos usar return, ya que esta sentencia solo devuelve el valor de una variable, si el programa trabaja con variables por referencia, se pueden devolver varios valores simultaneamente.
Eso si, podrias solucionar el problema anterior, usando variables globales, pero ocupan espacio en memoria aun cuando no se usen, ademas, de que puedes perder un poco el hilo de que funcion esta controlando dicha variable global en caso de depurar errores.
Un ejemplo de utilizacion de punteros para comunicarse dos funciones...
intercambia(int *u,int *v)
{
int temp;
temp=*u;
*u=*v;
*v=temp;
}
main()
{
int x=5, y=10;
printf("x = %d e y = %d.
", x, y); // Muestra los valores antes de intercambiar
intercambia(&x,&y); // Envia las direcciones de las variables
printf("Ahora x = %d e y = %d.
", x, y); // Muestra los valores despues de intercambiar
}
Otra posibilidad es la de trabajar con arrays usando punteros, de forma que puedas manipularlos su contenido o leer sus valores.
E igualmente pueden trabajar con funciones.
Aunque la verdad es que hasta ahora en CCS no he utilizado yo los punteros.
Bueno, espero haberte dado algo de luz...