I joined right after seeing this thread. Let's see...
So you normally start counting at '0' and not '1'?
That's right. [i]Counting[/i] starts from 1. However, indexing is not a method for counting. It's a method for [i]referencing[/i] elements in an array. For example, std::vector::size() returns 1 when the last element in a vector is 0. It returns 1. So you see, computers also count starting from one (how would they define emptiness if they started counting from zero?).
There's no such thing as a "zeroth element". In C/++, is first element (ordinal notation) in an array is element 0 (cardinal notation). In BASIC, the first element in an array is element 1.
While the index for the first element could start at any number (0, 1, -145, 12.5), it makes more sense for it to be an offset from the start of the structure, since this is the way computers work. And yes, it [i]is[/i] the programmer who has to adapt to the computer (at least for now), not viceversa. Otherwise, a typical computer program would be "print my name to the screen" or "integrate f(x)=(x^2+x)/2, then save the result in LaTeX and print it".
Now, using 1-based indexing can actually be [i]more[/i] confusing than 0-based indexing. For example, when questioned about the first year of the 21st century, most people will answer it's the 2000, when it's actually the 2001. That's because there never was a year 0. The first day of the age was 0001-01-01 (I'm ignoring such details as calendar conversion. This is just a demonstration). If the 21st century started 2000 years after the year 1, then it started on 2001. So the problem here is that we're using an ordinal system as if it was a cardinal system.