вопрос, связанный с индексом массивов на языке c - PullRequest
5 голосов
/ 04 декабря 2010

почему первый индекс массивов начинается с 0

Ответы [ 6 ]

5 голосов
/ 04 декабря 2010

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

Обновление по комментарию Хорошо, я попробую.

Рассмотрим массив байтов с 10 элементами:

byte array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Рассмотрим ячейки памяти, в которых расположен этот массив (предположим, он начинается с адреса 0010h):

   0010  0011  0012  0013  0014  0015  0016  0017  0018  0019
  +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  10 |
  +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

Наша переменная array указывает на 0010h.

Смещение 1 (первый элемент) равно 0, а его фактический адрес равен 0010 + 0 (где 0010 - это адрес array, а 0 - это смещение).

Смещение 3 (третий элемент) равно 2, потому что оно находится в третьей ячейке, а размер ячейки составляет 1 (потому что у нас есть байтовый массив). Фактический адрес третьего элемента 0010 + 2.

Возвращаясь к нашему языку программирования: array[0] означает содержимое ячейки памяти с адресом 0010, array[1] означает содержимое ячейки памяти с адресом 0010 + 1 (второй элемент) и скоро. *array в C относится к первому элементу, *(array+1) - ко второму.

2 голосов
/ 04 декабря 2010

По той же причине, по которой математически мыслящие люди называют завтра «через один день», а не «через два дня».

1 голос
/ 04 декабря 2010

Потому что арифметика с указателями проще.

В C вы можете рассматривать массивы как указатели. Таким образом, если у вас есть этот массив:

char a[50];
char *ptr = a;

Используя арифметику указателя, вы можете переместить указатель, добавив к нему целые числа таким образом:

*(ptr + 0); // first character in the array
*(ptr + 1); // second character in the array
// so on, so forth
0 голосов
/ 28 января 2014

Первый индекс всегда начинается с нуля, так как компиляторы используют значение индекса для вычисления фактического адреса элемента в массиве.

Рассмотрим следующий пример.

void someFunction()
{
    int exampleArray[5] = {0, 1, 2, 3, 4};
}

"exampleArray", требуется место для хранения 5 элементов, и каждому элементу потребуется количество места, необходимое для хранения типа данных "int".В зависимости от платформы (16-битная / 32-битная или 64-битная) и операционной системы, размер типа данных «int» может быть разным.Для нашего обсуждения, допустим, что размер «int» составляет 4 байта.

Таким образом, чтобы сохранить вышеупомянутый массив в памяти, нам нужна память для 5 целых чисел = 5 * 4 = 20 байтов.Теперь у каждого элемента в этом массиве есть «адрес».

Допустим, «exampleArray» хранится по адресу 100. Тогда адрес элемента с индексом «i» будет равен 100 + (i * sizeof (int)).Таким образом, для приведенного выше массива

Index 0, address = 100 + (0 * 4) = 100
Index 1, address = 100 + (1 * 4) = 104
Index 2, address = 100 + (2 * 4) = 108
Index 3, address = 100 + (3 * 4) = 112
and so on..

Так компилятор генерирует код для доступа к индексам массива.Поэтому, когда мы пишем exampleArray [2], компьютер должен иметь возможность вычислить адрес элемента по индексу 2, чтобы иметь возможность доступа к его ячейке памяти и, таким образом, к его значению.Таким образом, согласно приведенной выше формуле, элемент с индексом «2» будет равен 100 + (2 * 4) = 108.

Поскольку 1-й элемент в массиве должен находиться по адресу 100, его индекс становится равным 0чтобы вычислить его адрес простым способом.

0 голосов
/ 04 декабря 2010

Первое и самое важное: потому что стандартный / ваш компилятор так говорит.Во-вторых, из-за арифметики указателя.Если у вас есть массив A, то A + 0 - это первый элемент, A + 1 секунда и так далее.Это способ отображения массива в памяти.

0 голосов
/ 04 декабря 2010

Поскольку элемент 0 находится на расстоянии 0 от начала массива. Это первый элемент, но он находится в позиции 0, точно так же, как в первом столетии нет более 100 лет.

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