Sei que a pergunta foi respondida, mas não resisti em compartilhar essa explicação.
Lembro-me dos Princípios de design do compilador. Vamos supor que a seja uma matriz int e o tamanho de int seja 2 e o endereço base de a seja 1000.
Como a[5]
vai 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
Essa explicação também é a razão pela qual índices negativos em matrizes funcionam em C.
ou seja, se eu acessar, a[-5]
ele 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
Ele me retornará o objeto no local 990. Por essa lógica, podemos acessar índices negativos no Array em C.
somearray-2
é indefinida, a menos que o resultado esteja na faixa do iníciosomearray
a 1 após o fim.