Вопрос: Тогда что же понимается под "эквивалентностью указателей и массивов" в С?

Ответ:
Большая часть путаницы вокруг указателей в С происходит от непонимания этого утверждения. "Эквивалентность" указателей и массивов не позволяет говорить не только об идентичности, но и взаимозаменяемости.

"Эквивалентность" относится к следующему ключевому определению:

значение [см. вопрос 2.5] типа массив-Т, которое появляется в выражении, превращается (за исключением трех случаев) в
указатель на первый элемент массива; тип результирующего указателя — указатель-на-Т.

(Исключение составляют случаи, когда массив оказывается операндом sizeof, оператора & или инициализатором символьной строки для массива литер.)

Вследствие этого определения нет заметной разницы в поведении оператора индексирования [], если его применять к массивам и указателям.
Согласно правилу, приведенному выше, в выражении типа а[i] ссылка на массив "a" превращается в указатель и дальнейшая индексация происходит так, как будто существует выражение с указателем p[i] (хотя доступ к памяти будет различным, как описано в ответе на вопрос 2.2).
В любом случае выражение x[i], где х — массив или указатель) равно по определению *((x)+(i)).

Смотри:
K&R I Разд.5.3 c.93-6;
K&R II Разд.5.3 c. 99;
H&S Разд.5.4.1 c. 93;
ANSI Разд.3.2.2.1, Разд.3.3.2.1, Разд.3.3.6 .
Автор: Кодт    Оценить