I have never used a pointer to save memory and I have never heard of a pointer being used to save memory. As you pointed out a pointer adds to the memory used in addition to the variable that is pointed to.
The main thing that a pointer provides is a kind of handle to a memory location because it contains the address of a variable. Having a pointer to a memory location provides a kind of flexibility because when having to reference the memory area from various parts of a program you can just use the pointer.
Using pointers also allows you to use dynamic memory allocation. You can allocate a memory area for a variable and access the area by using the pointer.
For simple variables and simple programs, pointers are not really that helpful. However for complex programs with large complex variables that have various life times, pointers are very helpful.
Pointers are also useful for applications where direct memory locations/addresses are used for device interactions such as you see with embedded software. You use a pointer to access a shared memory area that is used to communicate with a device.
Pointers in C also allow you to use algorithms and complex data structures such as trees and linked lists more easily. The use of pointers reduces the amount of CPU time spent copying data from one memory location to another because rather than moving data from one place to an other, you instead change the values of pointers.
There are downsides to pointers which is why languages such as Java do not use them. Instead of pointers Java uses memory references or handles to data items. There is more overhead involved however the use of handles rather than pointers means helps the Java virtual machine to identify unused memory areas for garbage collection.
C was originally envisioned as a kind of systems programming language for operating systems and system software where efficiency and little as possible overhead is needed. Pointers is the way that C does some of the memory access that would require the use of assembler language if the pointer did not exist.