A pointer is just a number storing a numerical index for a memory location. Every non-trivial program in every language needs such numbers to keep track of where interesting functions and data are. In some languages the use of pointers is hidden - you just see some identifier like "employee_name" and internally the compiler or interpreter has arranged for storage and passes the pointer thereto around as it needs to to make the program behave as stipulated by the language, but they're always there underneath.
If you can't see the pointer use, you can't always reason about which operations in the language are cheap and which incur costs.
In some dumbed-down languages like VB, it used to be that more advanced data types like associative containers (std::map
, std::unordered_map
), linked lists, graphs etc. weren't available; clumsy functions would have to be used that internally used C or C++ to track the relationships between data elements. Working directly in C++, you can create such data types yourself to model arbitrary relationships with the precise behavioural, performance and memory use compromises that suit you.
C++ exposes pointers so that you have explicit control over whether the memory area used by an existing object is passed around different parts of the program, potentially granting them access to change the value or even deallocate the memory. This is more efficient than other languages like Java, Ruby and C# where it's less obvious which code has access to some data versus a copy of that data, when the copying can happen, when the data is no longer needed. Things like garbage collection exist to try to track use of data, but typically introduce performance issues, inefficiencies and unpredictable timing of destruction - whether than matters depends on the application.