You don't need pointers. They are just one way of doing things.
In low level languages, and at the hardware level, pointers are everywhere, though. If you dig down enough, everything on a computer is about memory addresses.
Example use of a pointer:
Let's say you want to efficiently store the current state of the keyboard, and the previous state of the keyboard. In a game or something.
Let's say there's an API call
GetKeyboardState( int array[255] ) to which you pass an array, and it fills it with a 0 or 1 at each position depending on whether each key is currently pressed down.
Let's make 2 arrays to hold the current and previous states:
code
int kb_state_0[255];
int kb_state_1[255];
Now let's make 2 pointers:
code
int * current_keyboard_state = kb_state_0;
int * previous_keyboard_state = kb_state_1;
Now everytime we read a new keyboard state, swap where the pointers are pointing, and read in the new data.
code
...
int * temp = previous_keyboard_state;
previous_keyboard_state = current_keyboard_state;
current_keyboard_state = temp;
GetKeyboardState( current_keyboard_state );
...
This is somewhat efficient because you don't actually have to move the whole 255-element arrays at any time. You just switch the pointers.
Hope I didn't screw that up...