Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему индексы в динамических массивах начинаются с нуля?

Eswon Esk Ученик (78), на голосовании 8 лет назад
Вопрос только чтобы понять насколько хорошо я знаком со специальностью. Моя версия такова - существенных причин для этого нет. Но поскольку десятичный ноль это восемь двоичных нулей (обычно), то ради ничего исключать его существование не нужно, строго приравнивая единицу как индекс такого массива к 00000001. Если на каком-то очень низком уровне переменную можно инициализировать нулями, то нет серьёзных причин не использовать её как есть для тех же индексов, это будет лишняя трата времени. Я прав?
Дополнен 8 лет назад
Проще говоря - всё это ради возможности правильно строить абстракцию в языке
Голосование за лучший ответ
kaiu Высший разум (120172) 8 лет назад
Ничего не понял :)
Сам индексы с нуля не люблю, но что поделать.
А так все идет с ассемблера, это просто нулевое смещение от указателя, потому и индекс у них ноль.
Игорь Стольников Гуру (4560) 8 лет назад
На самом деле сколько программистов, столько и ответов на вопрос.
---------------------
Кто говорит что:
"Ноль (значение-по-умолчанию, часто при чтении из файлов более старого формата лишние поля забивают нулями) при такой нумерации является инвалидным индексом.
Как и нулевой указатель является инвалидным указателем, например. "
---------------------
Кто говорит что :
"Чтобы не вычитать искуственно единицу при адресации в машкодах. "
---------------------
Кто говорит что:
"Индекс элемента массива - это именно индекс элемента, а не его порядковый номер.
Строго говоря, индекс не обязан идти с шагом 1 и начинаться с нуля, или с 1.
Тот факт, что индекс сишного массива начинается с нуля - это особенность конкретно сишного массива.
Технически, ничто не мешает запилить "разряженный массив", индексы в котором могу быть какими угодно числами из некоторого диапазона. "
---------------------
Кто говорит что:
"нулевой указатель вполне валиден и его можно передавать в free/delete например. "
Источник: пишу любые программы, цена от 100р
Андрей НевзоровЗнаток (398) 5 лет назад
dedi voevali a te pro unvalidov shutish
Доктор Акаса Просветленный (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 например, или иначе? Если нет - извините, пойду читать, тут только хотел проверить что я правильно понимаю на данный момент.
Доктор Акаса Просветленный (44439) указатель где-то храниться, занимает допустим 4 байта и указывает на некий блок памяти. этот блок не обязан быть рядом с указателем, указатель можно указать на любой другой блок, любой длины, длины блока он не хранит, только указывает где находится первый элемент. условно это как записка на холодильнике "носок в шкафу, на третьей полке справа"
dragunov_andrey Просветленный (25581) 8 лет назад
Строго говоря, индексом может служить любое упорядоченное множество. На уровне же побитовых операций (импульсов из электронов внутри триггеров) наименьшей величиной является отсутствие сигнала. Разумно с этой позиции начинать нумерацию. Иначе при нумерации тупо пропадает лишняя возможность использовать триггеры памяти.

Языки и их принципы были изобретены в далёкие времена, когда память была очень ограничена. 48 килобайт это просто манна небесная для домашнего пека вроде спектрума.
Eswon EskУченик (78) 8 лет назад
Получается, я про упущенные зря нули верно подумал?
dragunov_andrey Просветленный (25581) Ну да. А если допустим сейчас ты будешь на элементной базе транзисторов паять схему с оперативной памятью. Ну например, два триггера, то всего они смогут принимать 4 вариантов состояний: 00, 01, 10, 11. Было бы глупо не использовать в логике вариант 00.
Рыба-катала Мыслитель (6376) 8 лет назад
Не совсем в тему ответ, но советую почитать справочник дональда кнута "искусство программирования", а конкретно первый том. Там крайне подробно описывается, что из себя представляют различные структуры данных на самом низком уровне и как с ними работают.
Metotron Искусственный Интеллект (114979) 8 лет назад
Потому что это бывает удобно в некоторых вычислениях.
Двумерных массивов по факту не существует, это одномерные, логически разбитые на строки. Чтобы посчитать номер элемента в таком одномерном массиве, нужно умножить номер строки на длину строки, а потом прибавить номер столбца. Получаем такую формулу:
N — номер строки элемента, M — номер столбца, X — длина строки, F — искомая величина
F = N*X+M
А теперь предположим, что индексы строк и столбцов начинаются с единицы.
Формула становится такой:
F = (N-1) * X + M, то есть, нужно сделать лишнее действие.
Пример не самый удачный, но более хороший сейчас придумывать нет времени. Помню, что когда сапёра в паскале писал, очень хотел, чтобы там нумерация с нуля была.
Похожие вопросы