I get that you need pointers for handling something that grows and shrinks dynamically. In instances where that isn't the case, to my understanding, you use pointers when: your object is too big to be stored on the stack, or when you would like a function to modify data outside of its scope (why not just use references here?). Is this line of thinking correct?
Other uses I can think of are for polymorphism and forward declarations. The other example people always give is pointer arithmetic and handling array indices, but then why not just use C++ iterators which just wrap pointers... Are there any other (common) cases? I used to think that pointers were useful as they allowed for objects to be passed around without the need for a full copy to be made, but surely move semantics allow you to accomplish that without the need for handling pointers?
Overall, I feel like I am using too many unnecessary pointers in my codebase and I would really appreciate it if someone could definitively clear things up.