Первый способ доступа к элементам массива связан с использованием обычных индексных выражений вида arr[i].
Второй способ связан с использованием адресного выражения (или выражения с указателем на массив)
*(ptr+i)
В общем случае индексное выражение в языке Си имеет вид:
выражение_1[выражение_2]
где выражение_1 – это любой указатель, например, идентификатор массив, а выражение_2 – это целая величина. Однако требуется только, чтобы одно из выражений было указателем, а второе целой величиной. Поэтому выражение_1 может быть целой величиной, а выражение_2 – указателем.
Рассмотрим, как вычисляется индексное выражение arr[5]. Идентификатор arr является указателем начала массива. В соответствии с правилами выполнения операции сложения указателя с целой величиной целая величина преобразуется к адресному представлению путём умножения её на размер типа, адресуемого указателем. Целая константа 5 умножается на размер типа int преобразованное значение числа 5 представляет 5 позиций типа int. Это преобразованное значение числа 5 складывается со значением указателя arr , то даёт адрес, относящийся к шестой ( т.к. нумерация идёт с нулевого индекса) позиции типа int после arr. К полученному результату применяется операция “разадресация”. Результатом является значение шестого элемента массива. В терминах языка Си это выглядит так:
arr[5]=*(arr+5)=*(arr+5*syzeof(int))
Следовательно следующие выражения ссылаются на шестой элемент массива arr.
arr[5]
5[arr]
*(arr+5)
*(5+arr)
Как следует из определения индексного выражения, любой указатель может быть задан с индексом. Указатель на массив также может быть проиндексирован. выражения
ptr[5]
5[pt]
ссылаются на тот же шестой элемент массива arr. Если расписать индексное выражение ptr[5], то получится адресное выражение
*(ptr+5)