Source: https://bytes.usc.edu/cs455/curr/lectures/notes/arrays2.pdf