Here's an analogy which may help you understand.
A pointer is like the address of an apartment building.
Many people may have the address of the same building.
If one of them changes the array (think of renovating the building) everyone will see it as they are all looking at the same thing.
When you 'delete' the array you mark the apartment building as condemned and available for re-development.
Many people may continue to have the address of the now condemned building after it is deleted.
If they reference the array after it's deleted (the building was condemned) it may, or may not, still be present. It depends on if the city got around to demolishing the condemned building. It's not safe to do but there's nothing preventing you from doing it. Sometimes you get lucky and the building is still there. Sometimes you'll find something new was built in that place. Sometimes the building falls down on you.
delete xordelete [] xthe variable you name doesn't matter. What matters is the value. For example sayint *x = new int;happens to setxto 0x12341234; now if the code containsdelete (int*)0x12341234;later on then the memory is correctly deallocated. (And of course if the value ofxisn't0x12341234then the program is broken.)std::shared_ptrand also to set the value of pointers toNULLafter they are deleted so I know (or get a better error) when they are incorrectly accessed after deletes.