Почему индексация начинается с нуля в 'C'? - PullRequest
144 голосов
/ 06 сентября 2011

Почему индексация в массиве начинается с нуля в C, а не с 1?

Ответы [ 12 ]

107 голосов
/ 06 сентября 2011

В C имя массива - это, по сути, указатель, ссылка на ячейку памяти, и поэтому массив выражений [n] ссылается на n-элементы ячейки памяти вдали от начального элемента.Это означает, что индекс используется в качестве смещения.Первый элемент массива точно содержится в ячейке памяти, на которую ссылается массив (0 элементов), поэтому его следует обозначить как массив [0].

для получения дополнительной информации:

http://developeronline.blogspot.com/2008/04/why-array-index-should-start-from-0.html

97 голосов
/ 23 ноября 2012

Этот вопрос был опубликован более года назад, но здесь идет речь ...


О вышеуказанных причинах

Пока Статья Дейкстры (ранее упоминалась втеперь удаленный ответ ) имеет смысл с математической точки зрения, он не так актуален , когда речь заходит о программировании.

Решение, принятоеСпецификация языка и разработчики компиляторов основаны на решении, принятом разработчиками компьютерных систем, начать отсчет с 0.


Возможная причина

Цитирование из Призыв к миру от Дэнни Коэна.

Для любого основания b первые b ^ N неотрицательных целых чисел представлены точно N цифрами (включая ведущие нули) только в том случае, если нумерация начинается с 0.

Это можно проверить довольно легко.В base-2 возьмите 2^3 = 8 Восьмое число:

  • 8 (двоичное: 1000), если мы начнем считать 1
  • 7 (двоичное: 111), если мы начнемсчет в 0

111 может быть представлен с использованием 3 битов, в то время как 1000 потребуется дополнительный бит (4 бита).


Почему эторелевантные

Адреса памяти компьютера имеют ячейки 2^N, адресуемые N битами.Теперь, если мы начнем считать с 1, для 2^N ячеек потребуется N+1 адресных линий.Дополнительный бит необходим для доступа ровно к 1 адресу.(1000 в вышеуказанном случае.).Другой способ решить эту проблему - оставить последний адрес недоступным и использовать N адресные строки.

Оба являются неоптимальными решениями по сравнению с начальным счетом в 0, при котором все адреса будут доступны, используя ровно N адресные строки!


Заключение

Решение начать отсчет с 0 с тех пор проникло во все цифровые системы , включая программное обеспечение, работающее на них, потому что это упрощает перевод кода к тому, чтоОсновная система может интерпретировать.Если бы это было не так, была бы одна ненужная операция перевода между машиной и программистом для каждого доступа к массиву. Упрощает компиляцию.


Цитирование из статьи:

enter image description here

26 голосов
/ 06 сентября 2011

Потому что 0 - это расстояние от указателя на начало массива до первого элемента массива.

Рассмотрим:

int foo[5] = {1,2,3,4,5};

Для доступа к 0 мы делаем:

foo[0] 

Но foo разлагается на указатель, и у вышеуказанного доступа есть аналогичный указатель арифметического способа доступа к нему

*(foo + 0)

В наши дни арифметика указателей используется не так часто. Еще тогда, когда это был удобный способ взять адрес и убрать X «целых» из этой начальной точки. Конечно, если вы хотите просто остаться на месте, просто добавьте 0!

21 голосов
/ 06 октября 2011

Поскольку индекс на основе 0 позволяет ...

array[index]

... должен быть реализован как ...

*(array + index)

Если бы индекс основывался на 1, компилятору нужно было бы сгенерировать: *(array + index - 1), и это "-1" ухудшило бы производительность.

12 голосов
/ 06 сентября 2011

Поскольку это сделало компилятор и компоновщик проще (легче писать).

Ссылка :

"... Ссылка на память по адресу исмещение представляется непосредственно в аппаратном обеспечении практически на всех компьютерных архитектурах, поэтому эта деталь конструкции в C облегчает компиляцию "

и

" ... это делает дляболее простая реализация ... "

5 голосов
/ 10 августа 2016

Индекс массива всегда начинается с нуля. Предположим, базовый адрес равен 2000. Теперь arr[i] = *(arr+i).Теперь if i= 0, это означает, что *(2000+0) равно базовому адресу или адресу первого элемента в массиве.этот индекс обрабатывается как смещение, поэтому индекс по умолчанию начинается с нуля.

5 голосов
/ 06 сентября 2011

По той же причине, что, когда наступает среда, и кто-то спрашивает вас, сколько дней до среды, вы говорите 0, а не 1, и что, когда наступает среда, и кто-то спрашивает вас, сколько дней до четверга, вы говорите 1, а не 2.

2 голосов
/ 05 августа 2015

Самым элегантным объяснением, которое я прочитал для нумерации с нуля, является наблюдение, что значения хранятся не в отмеченных местах в числовой строке, а в промежутках между ними.Первый элемент сохраняется от нуля до единицы, следующий - от одного до двух и т. Д. N-й элемент сохраняется от N-1 до N. Диапазон элементов может быть описан с использованием чисел с обеих сторон.Отдельные предметы по договоренности описываются с помощью номеров под ними.Если для каждого задан диапазон (X, Y), идентификация отдельных номеров с использованием числа, указанного ниже, означает, что можно идентифицировать первый элемент без использования какой-либо арифметики (это элемент X), но нужно вычесть один из Y, чтобы идентифицировать последний элемент (Y-1).Идентификация предметов с использованием числа, указанного выше, облегчит идентификацию последнего элемента в диапазоне (это будет элемент Y), но сложнее определить первый (X + 1).

Хотя это не будетУжасно идентифицировать предметы, основываясь на количестве над ними, определяя первый предмет в диапазоне (X, Y), как тот, что выше X, как правило, лучше, чем определять его как нижний (X + 1).

1 голос
/ 12 ноября 2018

Предположим, мы хотим создать массив размером 5
массив int [5] = [2,3,5,9,8]

пусть 1-й элемент массива направлен в точку 100

и пусть мы рассмотрим индексацию, начинающуюся с 1, а не с 0.

Теперь мы должны найти местоположение 1-го элемента с помощью индекса
(помните, что расположение 1-го элемента - 100)

так как размер целого числа 4-битный
поэтому -> с учетом индекса 1 позиция будет
размер индекса (1) * размер целого числа (4) = 4
поэтому фактическая позиция, которую он нам покажет,

100 + 4 = 104

, что неверно, поскольку начальное местоположение было на уровне 100.
он должен указывать на 100, а не на 104
это неправильно

теперь предположим, что мы взяли индекс с 0
тогда
позиция 1-го элемента должна быть
размер индекса (0) * размер целого числа (4) = 0

поэтому ->
расположение 1-го элемента - 100 + 0 = 100

и это было фактическое местоположение элемента
Вот почему индексация начинается с 0;

Я надеюсь, что это прояснит вашу точку зрения.

1 голос
/ 05 августа 2015

Попробуйте получить доступ к пиксельному экрану, используя координаты X, Y на основе матрицы 1. Формула очень сложная. Почему это сложно? Поскольку вы в конечном итоге преобразуете координаты X, Y в одно число - смещение. Зачем вам нужно конвертировать X, Y в смещение? Потому что так организована память внутри компьютеров, как непрерывный поток ячеек памяти (массивов). Как компьютеры работают с элементами массива? Использование смещений (смещения из первой ячейки, модель индексации с нуля).

Так что в какой-то момент кода, который вам нужен (или необходим компилятор), нужно преобразовать формулу с 1 базой в формулу с 0, потому что именно так компьютеры работают с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...