I think the most common use is to make a function affect more than one variable.

Say you want to change the X and Y position of something on the screen. Your function could return one value to be assigned to either X or Y, but not both. You can pass-in as many pointers as you wish. So your function could directly change both X and Y.

Ummm... Also, when you pass a variable to a function, you're NOT passing the variable. You are passing the VALUE of the variable. In fact this is called "passing by value". Often the variable name is even different inside the function. (This can be confusing for beginners.)

Along with the reasons given above, pointers are necessary for runtime polymorphism, i.e. a combo with virtual functions.
Also necessary for arrays as they technically cannot be passed to a function as a whole, only the address is passed. Thats much more efficient. And using pointer arithmetic to access array elements is executed faster than indexing an array. [I dont know the details about that fact, but it just is]
Almost forgot. Strings - pointers are a must for working with strings. Frankly, I dont know how Java-ers manage.