Para que serve os ponteiros além de apenas guardar endereços de memória?
Imagine você precisando achar uma informação em um livro, o que você faz? Naturalmente você vai no índice, buscar o numero da pagina (ponteiro) e vai na pagina pegar a informação. Em computação é a mesma coisa, imagine agora todos os sistemas de informática e toda vez que você precisa achar uma informação, ali de uma forma ou de outra vai estar usando algum tipo de ponteiro.
Servem “só” pra isso.
Mas não acho que sua pergunta é só essa. Sua pergunta é mais “quais as vantagens de se usar ponteiros e trabalhar com endereços de memória”. Do jeito que sua pergunta está, poderíamos perguntar a mesma coisa sobre qualquer outro tipo (“pra que serve uma variável do tipo inteiro, é só pra guardar números inteiros?”).
A principal vantagem dos ponteiros, assim como qualquer outro tipo, é o que se pode fazer com eles. No caso de ponteiros, um exemplo simples é: imagine que você carrega um arquivo xml de 200 MB na memória, e precisa que diferentes funções acessem esse arquivo. Ao invés de passar o conteúdo inteiro do arquivo para cada função (aumentando o consumo de processamento e de memória), você passa o endereço de memória onde o arquivo está, e cada função opera sobre a mesma cópia do arquivo. Isso economiza memória e processamento.
Linguagens gerenciadas como Java e C# fazem isso “por baixo dos panos”, então você sempre está passando endereços dos objetos, ao invés de cópias inteiras deles. Por isso não precisam de um tipo ponteiro, já que tudo é ponteiro.
Fora que ponteiros permitem certas operações, como aritmética de ponteiros, que torna trivial a implementação de certas estruturas de dados (como listas).
Abraço.