Язык С


         

Массивы, указатели и индексация


Каждый раз, когда идентификатор, имеющий тип массива, появляется в выражении, он преобразуется в указатель на пер- вый член этого массива. Из-за этого преобразования массивы не являются 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" хранятся построчно ( последний индекс изменяется быстрее всего) и что первый индекс в описании помогает определить общее количест- во памяти, требуемое для хранения массива, но не играет ни- какой другой роли в вычислениях, связанных с индексацией.



    Содержание  Назад  Вперед