In the past, vectors, hashmaps, or other similar datastructures have been used (to great success) when explaining ownership. They usually have much clearer, more familiar ownership boundaries and problems such as iterator invalidation and dangling references that Rust takes care of. Just using owning pointers is a bit of a contrived simplification. See [Niko's slides](http://smallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf) or [a video of his presentation at linux.conf.au](http://mirror.linux.org.au/pub/linux.conf.au/2014/Friday/107-The_Rust_language_memory_ownership_and_lifetimes_-_Nicholas_Matsakis.mp4).