There's also significant performance benefits. You can pass a pointer to the first element of an array, instead of passing an entire array.
Code:
void function (int[100] craptaco) { } // fail.
void function (int * woohoo) { (*woohoo)[0] ... (*woohoo)[99] } // win!
So that makes working with arrays more flexible, or vectors, or what ever. You can have a global object that tracks and stores program data, then use pointers as references those structures instead of copying the entire thing in to a function scope.
There's a lot of clever and creative uses for pointers that simply make managing large or complex objects much more efficient.