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

Пусть, например, объявлен массив элементов типа float.

float arr[10];

Чтобы получить доступ к 5-му элементу массива аrr, нужно написать аrr[5]. При этом индекс 5 умножается на размер переменной float-типа (четыре байта) для того, чтобы вычислить смещение 5-го элемента массива аrr относительно его начала. Затем полученное значение складывается с начальным адресом массива аrr, что в свою очередь дает адрес 5-го элемента массива.

Таким образом, результатом индексного выражения arr[i] является значение i-го элемента массива.

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

Для ссылки на элемент многомерного массива индексное выражение должно иметь несколько индексов, заключенных в квадратные скобки:

Идентификатор массива '[' Индексное выражение1 ']' '[' Индексное выражение2 ']'…

Такое индексное выражение интерпретируется слева направо, т. е. вначале рассматривается первое индексное выражение:

Идентификатор массива '[' Индексное выражение1 ']'

Результат вычисления этого выражения — это адрес первого элемента вложенного массива, с которым складывается индексное Выражение 2, и т. д. Считывание элемента массива осуществляется после вычисления последнего индексного выражения. Отметим, что если к двумерному массиву применить только один индекс, то результатом будет не значение первого элемента вложенного массива, а его адрес.

Например, пусть объявлен трехмерный массив mass:

int mass [2] [5] [3];

Рассмотрим процесс вычисления индексного выражения mass [1] [2] [2].

1. Вычисляется выражения mass [1]. Индекс 1 умножается на размер элемента этого массива, которым является двухмерный массив, содержащий 5x3 элементов типа int. Получаемое значение складывается с начальным адресом массива mass. Результатом является адрес вложенного двухмерного массива размером (5x3) в трехмерном массиве mass.

2. Второй индекс 2 умножается на размер массива из трех элементов типа int и складывается с адресом mass [1].

3. Так как каждый элемент трехмерного массива — это величина типа int, то третий индекс 2 умножается на размер int-типа (в С-51 это два байта) перед сложением с адресом mass [1] [2].

4. Наконец, выполняется считывание значения полученного элемента массива int-типа.

Если было бы указано mass [1] [2], то результатом был бы адрес массива из трех элементов типа int. Соответственно значением индексного выражения mass [1] является адрес двухмерного массива.

Выражение выбора элемента применяется, если в качестве операнда надо использовать поле структуры или объединения. Такое выражение имеет значение и тип выбранного элемента. Рассмотрим две формы выражения выбора элемента:

Имя'.' Поле

Имя"->"Поле

В первой форме имя представляет величину типа struct или union, а поле — это имя элемента структуры или объединения. Во второй форме выражение используется при работе с указателями на структуры или объединения. При этом поле — это имя выбираемого элемента структуры или объединения. То есть выражение

Имя "->" Поле

эквивалентно записи

"(*" Имя')'.Поле

Пример:

struct tree {float                num;

                 int                   spisoc[5);

                 struct tree       *left;

                } tr[5], elem;

             elem.left = & elem; 

В приведенном примере используется операция выбора ('.') для доступа к полю left структурной переменной elem. Таким образом, элементу left структурной переменной elem присваивается адрес самой переменной elem, т. е. переменная elem хранит указатель на себя саму.

Приведение типов — это изменение (преобразование) типа объекта. Приведение типов используется для преобразования объектов одного скалярного типа в другой скалярный тип. Для выполнения преобразования необходимо перед объектом записать в скобках нужный тип:

'(' Имя типа ')' Операнд.

Пример использования функции приведения типов при вычислении выражений:

int i;

float x;

х = (float)i+2.0;

Перейти на страницу:

Поиск

Похожие книги