Pointers are addresses. Think of them as pieces of paper with a house address written on them.
int* array = new int[10];
is building a row of 10 houses (new int[10]), then writing down where those houses are and storing the address in array.
Saying array is an array is a problem that will confuse you. It is mistaking the address of a house for a house. A piece of paper saying 123 road street isn't my house, even if it uniquely names my house.
Mistaking the map for the territory is really easy, and leads to confusion. You have to do some work to untangle that.
array1=array2 is taking the piece of paper array1 and writing the address of the 2nd block of houses over it. It is doing nothing to the houses. They are still out there -- but you might no longer have a record of where they are. So now they will become derelict and lost (this is called a memory leak).
array1[0] = array2[0] taking the piece of paper called array2, walking to the address listed on it, and looking at the first house there (aka 0). Then it is pulling out a scanner and scanning the entire house.
You then walk over to the spot array1 says there is a row of houses. You go to the first house (aka 0) and you pull out your scanner. You flip the switch from scan to print, and aim it at the house.
It proceeds to destroy the house that is there, and print a copy of the house you scanned over on the block named by array2.
You then walk back to the block named by array2, scan array2[1] the 2nd house on the block, walk back and print it over array1[1] the second house on the first block.
This is a very, very different operation than scratching the address of the block on a piece of paper and replacing it.
Now, &array1[0] is going to the block named by array1, going to the first house [0], then reading the address written on it (&). As we name blocks by the address of the first house, this turns out to match what we have written down in array1 itself.
array1[1] is going to have a different address -- &array1[0] -- but it will be next-door to array1[0].
new int[10];initializations)array1andarray2are pointers. In second case you are actively copying by value. Edit: removed unecessary usage of "essentially"