since most people want to program for games perhaps this example might make sense:
Say you load an image of a monster to use in your game. This image is stored in memory.
Say your game will have 5 monsters that will use this one image. Instead of making 5 copies of the image as regular variables would do (5x as much memory used) you instead have each monster use a pointer so that all 5 monsters point to a single image. (1x memory usage)
Pointers are also good for making structures such as linked lists or dynamically allocating of memory.
i.e. A program that may store anywhere from 1 to 1000 values.
int a; // Big enough to hold worst case scenario
From personal experience these suckers come in useful.
> How many values this time Ernie? (userInput)
> userInput = 25
int *a = new int[userInput]; // Array size determined at runtime and is only as big as necessary.