We can have pointers to pointers. If we don't know how many variables we will need, we have to declare, for example, an array that is bigger than the maximum number of objects that we might want. Even this isn't always possible. If we change the value of the pointer, without saving it somewhere, we have lost the object. Allocating arrays with new .
Arrays are just pointers to some memory.
If we declare them statically, the memory is on the stack and it goes away when the function exits. If we declare them dynamically, the memory last until we explicitly get rid of it. For example, a sort program could take an unsorted list and return a pointer to a sorted list. The new operator creates an object that lives for the duration of the program. The object does not get destroyed as soon as you exit the function in which it was created.