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

Каждый раз, когда идентификатор, имеющий тип массива,появляется в выражении, он преобразуется в указатель на пер-вый член этого массива. Из-за этого преобразования массивыне являются l_значениями. По определению операция индексации"[]" интерпретируется таким образом, что e1 [ e2 ] считаетсяидентичным выражению * ((e1)+(e2)). Согласно правилам преоб-разований, применяемым при операции +, если e1 - массив, а e2 - целое, то e1 [ e2 ] ссылается на e2 -й член массива e1. Поэтому, несмотря на несимметричный вид, операция индексацииявляется коммутативной. В случае многомерных массивов применяется аналогичноеправило. Если e является n -мерным массивом размера i * j *...* k, то при появлении в выражении e преобразуется вуказатель на (n -1)-мерный массив размера j *...* k. Если опе-рация * либо явно, либо неявно, как результат индексации,применяется к этому указателю, то результатом операции будетуказанный (n -1)-мерный массив, который сам немедленно преоб-разуется в указатель. Рассмотрим, например, описание: int u [3][5]; Здесь u - массив целых размера 3*5. При появлении в -47- выражении u преобразуется в указатель на первый из трех мас-сивов из 5 целых. В выражении u [ i ], которое эквивалентно * (u + i), сначала u преобразуется в указатель так, как описановыше; затем i преобразуется к типу u, что вызывает умножение i на длину объекта, на который указывает указатель, а именнона 5 целых объектов. Результаты складываются, и применениекосвенной адресации дает массив (из 5 целых), который в своюочередь преобразуется в указатель на первое из этих целых.Если в выражение входит и другой индекс, то та же самаяаргументация применяется снова; результатом на этот разбудет целое. Из всего этого следует, что массивы в языке Си хранятсяпострочно (последний индекс изменяется быстрее всего) и чтопервый индекс в описании помогает определить общее коли-чество памяти, требуемое для хранения массива, но не играетникакой другой роли в вычислениях, связанных с индексацией.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: