Why is it zero indexed? Tradition. Why did that tradition start? The best explanation I can think of is because array access is a convenient short hand for pointer math:
array[i] translates perfectly into array_memory_start + i*element size. Thus the tradition was most likely born.