Каждый раз, когда идентификатор, имеющий тип массива,появляется в выражении, он преобразуется в указатель на пер-вый член этого массива. Из-за этого преобразования массивыне являются L-значениями. По определению операция индексация[] интерпретируется таким образом, что E1[E2] считаетсяидентичным выражению *((е1)+(е2)). Согласно правилам преоб-разований, применяемым при операции +, если E1 - массив, ае2 - целое, то е1[е2] ссылается на е2-й член массива е1. По-этому несмотря на несимметричный вид операция индексации яв-ляется коммутативной. В случае многомерных массивов применяется последователь-ное правило. Если е является N-мерным массивом размераI*J*...*K, то при появлении в выражении е преобразуется вуказатель на (N-1)-мерный массив размера J*...*K. Если опе-рация * либо явно, либо неявно, как результат индексации,применяется к этому указателю, то результатом операции будетуказанный (N-1)-мерный массив, который сам немедленно преоб-разуется в указатель. Рассмотрим, например, описание INT X[3][5]; Здесь X массив целых размера 3*5. При появлении в выраженииX преобразуется в указатель на первый из трех массивов из 5целых. В выражении X[I], которое эквивалентно *(X+I), снача-ла X преобразуется в указатель так, как описано выше; затемI преобразуется к типу X, что вызывает умножение I на длинуобъекта, на который указывает указатель, а именно на 5 целыхобъектов. Результаты складываются, и применение косвеннойадресации дает массив (из 5 целых), который в свою очередьпреобразуется в указатель на первое из этих целых. Если ввыражение входит и другой индекс, то таже самая аргументацияприменяется снова; результатом на этот раз будет целое. Из всего этого следует, что массивы в языке "C" хранятсяпострочно ( последний индекс изменяется быстрее всего) и чтопервый индекс в описании помогает определить общее количест-во памяти, требуемое для хранения массива, но не играет ни-какой другой роли в вычислениях, связанных с индексацией.