Source: http://web.eecs.umich.edu/~aprakash/eecs282/lectures/05-arrays-lecture.pdf