The index or subscript value of an array starts form 0. so when a subscript of an array for example a[] is declared as 5, Then five memory blocks will be allocated for the array a[5] as a[0], a[1], a[2], a[3], a[4]. so the range or subscripts for an index of five is 0 to 4 i,e 0 to 5-1. similarly the range or subscript for an array size of n is 0 to n-1.
Two dimensional elements are stored mainly on compiler dependency. The storage of elements is done by the compiler. The elements are stored according the order we give to the compiler. Generally we store the elements in a two dimensional array in a row dependent by using two for loops and making the inner for loop as dependent for row. however we can store elements into a two dimensional array in any order. so the storage of elements in a two dimensional array is compiler dependent.
Because array elements are stored in sequential memory locations. when an array is declared as a[5] then the elements are stored in a sequential memory locations as a[0], a[1], a[2], a[3], a[4]. The sequence of memory allocation(index of array) starts with 0.