0

In C, when I define an array like int someArray[10], does that mean that the accessible range of that array is someArray[0] to someArray[9]?

Liam Marshall
  • 1,353
  • 1
  • 12
  • 21
  • that is true my friend – Ryan Mar 24 '15 at 03:08
  • See also [Why does indexing start with zero in C?](http://stackoverflow.com/questions/7320686/why-does-the-indexing-start-with-zero-in-c) — and there are numerous other related questions too. – Jonathan Leffler Mar 24 '15 at 03:20
  • I understood that indexing is 0-based in c, I just didn't understand that an defining an array `...[10]` meant 0...9 and not 0...10 :D – Liam Marshall Mar 24 '15 at 14:10

3 Answers3

4

Yes, indexing in is zero-based, so for an array of n elements, valid indices are 0 through n-1.

MooseBoys
  • 6,641
  • 1
  • 19
  • 43
2

Yes, because C's memory addressing is easily computed by an offset

myArray[5] = 3

roughly translates to

store in the address myArray + 5 * sizeof(myArray's base type)
the number 3.

Which means that if we permitted

myArray[1]

to be the first element, we would have to compute

store in the address myArray + (5 - 1) * sizeof(myArray's base type)
the number 3

which would require an extra computation to subtract the 1 from the 5 and would slow the program down a little bit (as this would require an extra trip through the ALU.

Modern CPUs could be architected around such issues, and modern compilers could compile these differences out; however, when C was crafted they didn't consider it a must-have nicety.

Edwin Buck
  • 69,361
  • 7
  • 100
  • 138
  • For one-based indices, there is no extra trip through the MMU. An additional arithmetic operation is required, but no access to memory happens, until the final address has been calculated. – IInspectable Apr 02 '15 at 11:55
  • Sorry, I meant ALU, but I guess my typing "muscle memory" worked against me this time. – Edwin Buck Apr 02 '15 at 12:55
1

Think of an array like this:

* 0   1   2   3   4   5   6   7   8   9
+---+---+---+---+---+---+---+---+---+----+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
+---+---+---+---+---+---+---+---+---+----+
                DATA

* = array indices

So the the range of access would be [0,9] (inclusive)

Ryan
  • 14,392
  • 8
  • 62
  • 102