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*.