I think 1 based arrays are useful because you can use unsigned integer types to index them, and use 0 to indicate a void index... with 0 based arrays you need signed types, then values lower than -1 are wasted.