Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
      1. Вызовы функций

Синтаксис:

<expression>(<expression-list>)

Вызов функции состоит из выражения <expression>, за которым следует список выражений <expression-list>. Значению выражения соответствует адрес функции (например, значение идентификатора функции). Значение каждого выражения из списка выражений (выражения в списке разделены запятыми) соответствует фактическому аргументу фнкции. Список выражений может быть пустым.

Выражение вызова функции имеет значение и тип своего возврата. Если тип возврата функции- void, то и выражение вызова функции имеет тип void. Если возврат из вызванной функции произошел не в результате выполнения оператора return, то значение функции не определено. В разделе 7.4. дана более полная информация о вызовах функций.

      1. Индексные выражения

Синтаксис:

<expression1>[<expression2>]

Здесь квадратные скобки - это терминальные символы. Индексное выражение представляет величину, адрес которой состоит из суммы значений выражения1 "<expression1>" и выражения2 "<expression2>". Выражение1- это любой указатель, такой как идентификатор массива, а выражение2- это целочисленная величина. Выражение2 должно быть заключено в квадратные скобки "[]".

Индексное выражение обычно используется для ссылок на элементы массива, тем не менее, индекс может появиться с любым указателем.

Индексное выражение вычисляется путем сложения целой величины <expression2> с значением указателя <expression1> c последующим применением к результату операции разадресации "*". Операция разадресации описана в разделе 5.3.3. Нарпимер, для одномерного массива следующие четыре выражения эквивалентны в предположении, что a- это указатель, а b- это целое.

a[b]

*(a + b)

*(b + a)

b[a]

В соответствии с правилами преобразования типов для операции сложения (см. раздел 5.3.6), целочисленная величина преобразуется к адресному представлению путем умножения ее на размер типа, адресуемого указателем. Например, предположим, что иденти фикатор line ссылается на массив величин типа int. Чтобы вычислить выражение line[i], целая величина i умножается на размер типа int. Преобразованное значение i представляет i позиций типа int. Это преобразованное значение складывается с начальным значением указателя line, что дает адрес, который расположен на i позиций типа int от line.

Последним шагом вычисления индексного выражения является операция разадресации, применяемая к полученному адресу. Результатом является значение элемента массива, который позиционирован.

Заметим, что индексное выражение line[0] представляет значение первого элемента массива, так как отсчет смещения ведется от нуля. Следовательно, такое выражение, как line[5], ссылается на шестой элемент массива.

Ссылки на многомерный массив.

Индексное выражение может быть снова проиндексировано. Синтаксис такого выражения следующий:

<expression1>[<expression2>][<expression3>]...

Данное индексное выражение интерпретируется слева направо. Сначала вычисляется самое левое индексное выражение <expression1>[<expression2>]. Адрес результата сложения <expressin1> и <expression2> имеет смысл адресного выражения, с которым складывается <expression3> и т. д. Операция разадресации осуществляется после вычисления последнего индексного выражения. Однако, операции разадресации не производится, если значение последнего указателя адресует величину типа массив (смотри третий и четвертый примеры ниже).

Выражения с несколькими индексами ссылаются на элементы многомерных массивов. Многомерный массив- это массив, элементами которого являются массивы. Например, первым элементом трехмерного массива является массив с двумя измерениями.

Примеры:

int prop[3][4][6];

int i, *ip, (*ipp)[6];

i = prop[0][0][1]; /* Example 1 */

i = prop[2][1][3]; /* Example 2 */

ip = prop[2][1]; /* Example 3 */

ipp = prop[2]; /* Example 4 */

Maccив, поименованный prop, содержит 3 элемента, каждый из которых- это массив 4 на 6 величин типа int. В примере 1 показано, каким образом сделать ссылку на второй элемент третьего массива 4 на 6 prop. Массив заполнен построчно, так что последний индекс меняется наиболее быстро. Выражение prop[0][0][2] ссылается на следующий (третий) элемент массива и т. д.

Во втором примере показана более сложная ссылка на отдельный элемент prop. Выражение вычисляется следующим образом:

  1. Первый индекс 2 умножается на размер типа int и на размер массива 4 на 6 и складывается с значением указателя prop. Результат будет указывать на третий массив размера 4 на 6 элементов в трехмерном массиве prop.

  2. Затем, второй индекс 1 умножается на размер 6-ти элементов типа int и складывается с адресом, соответствующим prop[2].

  3. Каждый элемент массива из шести элементов- это величина типа int, поэтому индекс 3 умножается на размер типа int перед сложением с адресом prop[2][1]. результирующий указатель адресует четвертый элемент массива из шести элементов.

  4. На последнем шаге вычисления выражения prop[2][1][3] выполняется разадресация указателя. Результатом является элемент типа int, расположенный по этому адресу.

В примерах 3 и 4 представлены случаи, когда разадресация не применяется. В примере 3 выражение prop[2][1]- это ссылка на массив из шести элементов в трехмерном массиве prop. Так как значение указателя адресует массив, то операция разадресации не применяется. Аналогично, результатом выражения prop[2] в примере 4 является значение указателя, адресующее двумерный массив.