>> Массивы сами по себе уже абстракция (foo[i] -- это смещение i относительно адреса foo).
> Память как таковая, в общем то тоже абстракция. На уровне физики чип
> RAM бывает например двухмерным массивом. Однако врядли вы будете в большом Это все очень интересно, но на причину "почему индексация массивов с 0 - более труЪ" не тянет от слова "совсем".
>> (т.е. на более низком уровне индексация массива может начинаться совсем не с 0)
> "Права купил, а ездить не купил?" :) Режимы адресации и их чудеса
> не имеют никакого отношения к тому с чего начинается адресное пространство.
"Очки купил, а читать …?" :) Специально цитировал на что отвечаю - спорить с анонимом по поводу "Может, потому что память начинается с адреса 0?" в качестве аргумента "нулевой индексации" не вижу смысла.
Т.е. тема - индексация массивов в различных ЯП и отображение на более нижнем уровне, а не "с чего начинается адресное пространство".
Приведенный выше листинг вполне валидный режим для индексации "в ручном режиме" массивов на стеке при ваянии "шедевров" прямо в x86асме, хотя народ конечно предпочитал LOCAL макросы или хотя бы EQU определения, вместо жонглирования относительными адресами.
Ну и заодно наглядно демонстрирует, что режим адресации "с 0" даже в "низкоуровневом" си не гарантирует такой же "маппинг" на более нижнем уровне.
И вообще, что foo[-10], что foo[10] - компилятору все едино (а уж современному с наворотами - он еще и варнинги "index out of array" будет выдавать).
Поэтому претензии вида "Индексация массивов начинается с 1 а не 0. Это все что вам нужно знать про это недоразумение." - не понятны.
Конкретно в cи причина сильно смахивает на гибрид наследия древних времен написания компилятора ручками (не нужно заморачиваться с семантикой и прослойкой для парсинга foo[-10, 10], для которого нужно запоминать и каждый раз вытаскивать определение массива) плюс определение сабскрипта E1[E2]<=> *((E1)+(E2)) (потому и возможны "кунстштюки" типа 10[x] в валидном коде),
т.е. ковыряние массив проходит как "указатель на первый элемент + смещение" => адресная арифметика, а запись foo[i] как синтактический сахар.
Если нужно "как проще" (для написания компилятора) то напрашивается индексация с 0: первый элемент foo[0]<=> foo+0 <==> foo и "больше ничего делать не надо" => т.е. сделали как проще, а не потому что мифическое "так ближе к железу!".
Вон, в фортране индексы вполне себе начинаются по умолчанию с 1 (а еще можно определить свой диапазон integer foo(-100:500)) - и ничего, (был) самый быстрый ЯП для вычислений туеву кучу лет.