Голосование за лучший ответ
kaiu
Высший разум
(120172)
8 лет назад
Ничего не понял :)
Сам индексы с нуля не люблю, но что поделать.
А так все идет с ассемблера, это просто нулевое смещение от указателя, потому и индекс у них ноль.
Игорь Стольников
Гуру
(4560)
8 лет назад
На самом деле сколько программистов, столько и ответов на вопрос.
---------------------
Кто говорит что:
"Ноль (значение-по-умолчанию, часто при чтении из файлов более старого формата лишние поля забивают нулями) при такой нумерации является инвалидным индексом.
Как и нулевой указатель является инвалидным указателем, например. "
---------------------
Кто говорит что :
"Чтобы не вычитать искуственно единицу при адресации в машкодах. "
---------------------
Кто говорит что:
"Индекс элемента массива - это именно индекс элемента, а не его порядковый номер.
Строго говоря, индекс не обязан идти с шагом 1 и начинаться с нуля, или с 1.
Тот факт, что индекс сишного массива начинается с нуля - это особенность конкретно сишного массива.
Технически, ничто не мешает запилить "разряженный массив", индексы в котором могу быть какими угодно числами из некоторого диапазона. "
---------------------
Кто говорит что:
"нулевой указатель вполне валиден и его можно передавать в free/delete например. "
Источник: пишу любые программы, цена от 100р
Доктор Акаса
Просветленный
(44439)
8 лет назад
суть именно как и было сказано в первом ответе - нулевое смещение.
в языке С++ указатель на динамический массив это указатель на первый элемент массива.
пусть есть такой динамический массив:
int * A = new int[n];
первый элемент получают так:
*A // или *(A + 0)
второй так:
*(A + 1)
краткая запись этой операции:
A[1]
точно так же сработает и такой код:
1[A]
ну и на самом деле операция A + 1 не смещает указатель на 1 байт, а смещает на столько байт, сколько требуется для одного элемента. суть sizeof(int) - размер для типа в байтах
Eswon EskУченик (78)
8 лет назад
Ясно в целом, я верно понимаю что под нулевым смещением следует понимать следование значения на которое ссылается указатель сразу строго за ним по порядку байт: как например есть шестнадцать байт памяти, 1-4 это указатель на значение, а 5-8 это само значение, а не 7-10 например, или иначе? Если нет - извините, пойду читать, тут только хотел проверить что я правильно понимаю на данный момент.
dragunov_andrey
Просветленный
(25581)
8 лет назад
Строго говоря, индексом может служить любое упорядоченное множество. На уровне же побитовых операций (импульсов из электронов внутри триггеров) наименьшей величиной является отсутствие сигнала. Разумно с этой позиции начинать нумерацию. Иначе при нумерации тупо пропадает лишняя возможность использовать триггеры памяти.
Языки и их принципы были изобретены в далёкие времена, когда память была очень ограничена. 48 килобайт это просто манна небесная для домашнего пека вроде спектрума.
Рыба-катала
Мыслитель
(6376)
8 лет назад
Не совсем в тему ответ, но советую почитать справочник дональда кнута "искусство программирования", а конкретно первый том. Там крайне подробно описывается, что из себя представляют различные структуры данных на самом низком уровне и как с ними работают.
Metotron
Искусственный Интеллект
(114979)
8 лет назад
Потому что это бывает удобно в некоторых вычислениях.
Двумерных массивов по факту не существует, это одномерные, логически разбитые на строки. Чтобы посчитать номер элемента в таком одномерном массиве, нужно умножить номер строки на длину строки, а потом прибавить номер столбца. Получаем такую формулу:
N — номер строки элемента, M — номер столбца, X — длина строки, F — искомая величина
F = N*X+M
А теперь предположим, что индексы строк и столбцов начинаются с единицы.
Формула становится такой:
F = (N-1) * X + M, то есть, нужно сделать лишнее действие.
Пример не самый удачный, но более хороший сейчас придумывать нет времени. Помню, что когда сапёра в паскале писал, очень хотел, чтобы там нумерация с нуля была.