Sé que la pregunta está respondida, pero no pude resistirme a compartir esta explicación.
Recuerdo los principios del diseño del compilador, supongamos que a es una matriz int y el tamaño de int es 2, y la dirección base de a es 1000.
Cómo a[5]
funcionará ->
Base Address of your Array a + (index of array *size of(data type for array a))
Base Address of your Array a + (5*size of(data type for array a))
i.e. 1000 + (5*2) = 1010
Esta explicación también es la razón por la que los índices negativos en matrices funcionan en C.
es decir, si a[-5]
accedo me dará
Base Address of your Array a + (index of array *size of(data type for array a))
Base Address of your Array a + (-5 * size of(data type for array a))
i.e. 1000 + (-5*2) = 990
Me devolverá el objeto en la ubicación 990. Mediante esta lógica, podemos acceder a índices negativos en Array en C.
somearray-2
no está definida a menos que el resultado esté en el rango desde el inicio desomearray
hasta 1 después de su final.