⎯⎯ Посмотреть 52 ответа ⌵ :
Если что первый элемент имеет индекс 0 из-за старых приколов, которые еще во времена языка C были (собственно, на его примере я и расскажу сейчас причины начала индексации с нуля). Ща объясню: есть вот такая штука, которая называется указателем (pointer). Она хранит адрес переменной в памяти. А есть еще одна прикольная штука с указателями: вы если их попробуете вывести в stdout, то получите что-то в духе 0x0001234F1234F000 (примера ради такой вывод). Чтобы получить то, что лежит по тому адресу, вам нужно разыменовать указатель. То есть, скажем, вы решили сделать указатель: int* p = malloc(sizeof(int)); Чтобы впихнуть число 5 по адресу p вам нужно сделать такое: *p = 5; То есть * есть оператор разыменования. И тогда вы вывести число 5 можете так: printf(“%d”, *p); А вот скажем, вам надо сделать массив. Скажем, вы под него выделили памяти на 5 элементов: int* arr = malloc(sizeof(int)*5); И в таком случае arr хранит адрес первого элемента. Если вы попробуете инкрементировать arr, то он начнёт хранить адрес следующего элемента. То есть arr[1] равносильно *(arr + 1), то есть равносильно разыменовыванию следующего (второго) элемента. И тогда уже очевидно, что *(arr+0) = *arr = arr[0]. То есть выражение вида arr[i] преобразуется в что-то в духе *(arr + i). Поэтому первый элемент и имеет индекс 0. То есть индекс (назовём его x. То есть вы получаете элемент через arr[x]) означает просто смещение от первого элемента массива на x элементов. При этом адрес хранится в указателе именно первого байта, независимо от типа данных (даже ребёнку известно, что int занимает 4 байта), так что, по сути, разница между адресами arr[0] и arr[1] при том, что arr - это int* (указатель на целое число на 4 байта), составит 4. То есть первый элемент вполне оправдано имеет индекс 0. Для новичков: интерпретируйте это как «элемент, стоящий через 0 элементов от первого». Думаю, так вам будет проще запомнить. Ещё понятнее то, как это работает, в языке ассемблера, но я уже не буду писать это, ибо мне лень… Хотя, если прям сильно хотите, могу накидать немного ниже объяснение с приведением кода на языке ассемблера
2026-08-27 17:09:00