How do you let more than one part of the program share the same data (provided that there might not be any data at all)?
How do you create an object that can outlive the scope where it was created (allocate memory dynamically)?
How do you create an object if the derived type is not known until at runtime (e.g you don't know at compile time whether the program is going to create a Dog or a Cat)?
Pointers are pretty much fundamental to programming in C++. It's just that you may not have learnt about situations where they are necessary.
The first introduction usually indeed makes you say 'So what, why wouldn't I manipulate the original variable instead'. But that just demonstrates the concept.
Code:
#include <iostream>
int main()
{
int n;
int* p = &n;
*p = 42;
std::cout << n << '\n'; //Wow!
}