I\'ve read this quote in a book:
There is no problem in computer science that can\'t be solved using another level of indirection.
One of the potential big advantages of indirection is reduced coupling. It's another way of saying that things should be compartmentalized appropriately. This often helps significantly with testing, maintainability, and flexibility over the long term.
As an example, if your application needs to read some persisted data, instead of having the specific knowledge of where (and how) to read it scattered all throughout the application, you isolate it (put that reading of data into a method) and then let all of the other parts of your application call that method to get the data instead of each part of the app having to deal with those details itself.
"Indirection" is using something that uses something else, in its broadest sense.
So your example, using a pointer of a value instead of the value, fits this definition at one level. The pointer is the something and the value is the something else.
Typically this is something larger in scope:
This last example, perhaps, explains the "why" of it all.
As we work with something we master it and learn how to abstract it to a higher level of abstraction, thus a new level of indirection is needed and we can solve bigger problems faster by offloading some of the work to the new API.