First of all, you don't have to engage in memory allocation in order to use a pointer.  You can have an array of `int` declared statically or on the stack, and you can use a pointer to visit the `int`s, and it is all very nice and simple and efficient.  No memory allocation needed.

As for dynamic memory allocation, it is used to solve problems that could not be solved otherwise, so it is necessary. Here is a simplistic example: Imagine you want to read the entire
   contents of a file.  Where are you going to store them?  If you try
   with a fixed-size buffer, then you will only be able to read files
   that are not longer than that buffer.  But by using memory
   allocation, you can allocate as much memory as necessary to read the
   file, and then proceed to read it.
   
Also, C++ is an object-oriented language, and there are certain
   aspects of OOP like *abstraction* that are only
   achievable using pointers.  Even languages like Java and C# make
   *extensive* use of pointers, they just don't allow you to directly manipulate the pointers, so as to prevent you from doing dangerous
   stuff with them, but still, these languages only begin to make sense
   once you have realized that behind
   the scenes everything is done using pointers.

So, pointers are *not* only used in time-critical, low-memory applications, they are used *everywhere*.