Массив — это такая структура данных языка С, в которой:
Осуществляется по индексу:
A[i] – i-й элемент массива.
Адрес начала массива — это адрес первого элемента.
В языке С обращение к элементу массива — это прямое обращение к области памяти по адресу элемента, который вычисляется по его индексу, и интерпретируется в соответствии с типом массива.
Отсюда и опасность бесконтрольного выхода за границы массива, отсюда и интересная возможность — посмотреть, а что там в памяти вообще есть?.. Однако, правильно ли мы интерпретируем те данные, до которых сможем дотянуться?
Кстати, обращение с отрицательными индексами не вызывает у компилятора вопросов:
A[-1] — это предыдущий элемент, который лежит в памяти за начальной границей, до массива.