To avoid repeating the whole chapter named Memory from your C++ book, I'll answer with that:
Raw pointers shouldn't own memory.
By consequence:
struct SomePointerStruct { int x; }
is trivially copyable, and:
struct SomePointerStruct { std::unique_ptr<int> x; }
is noncopyable (but it's moveable). That extends to all of your other types (if they are properly constructed), sans the "trivially", perhaps. The fact that the pointer value would be copied in your original example would of course lead to a lot of problems, but since they can be easily avoided by using what I wrote above, it's kind of off the scope WRT such a simple assignment.
A whole another thing would be a non-owning pointer case, in which a copied struct would, of course, point to the same region of memory. You lose all the guarantees of the pointer pointing to a valid location, though, so a reference would be preferred.
As for creating of a dynamic array, you'd be best off with simply using std::vector.
std::shared_pointer<int>instead. If you need a dynamic array, why not use astd::vector<int>? Copying the vector will automatically copy the data it holds as well. You can also just as well use ashared_ptrwith an actual array, but need to provide a custom deleter that actually callsdelete[].