double arrow

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


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


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