Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
234
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

Указатели как средство доступа к компонентам структур.

Указатели как средство доступа к компонентам структур.

Указатель на структуру, настроенный на конкретную структуру (конкретный объект) того же типа, обеспечивает доступ к ее элементам двумя способами:

( * указатель_на_структуру ).имя_элемента

или

указатель_па_структуру -> имя_элемента

Первый способ традиционный. Он основан на обратимости операций разыменования '*' и получения адреса '&'. Обозначив знак равенства последовательностью '= =', можно таким образом формально напомнить эти правила на конкретном примере:

если

то

Доступ к элементам структуры dot[0] с помощью разыменования адресующего его указателя pinega можно в соответствии с приведенными соотношениями реализовать с помощью таких конструкций:

Важным является наличие скобок, ограничивающих операцию разыменования (*pinega). Скобки необходимы, так как бинарная операция "точка" имеет более высокий ранг, чем унарная операция разыменования (см. табл. 1.4 приоритетов операций в гл. 1).

Присвоить элементам структуры dot[0] значения можно, например, с помощью таких операторов присваивания:

• Второй способ доступа к элементам структуры с помощью "настроенного" на нее указателя предусматривает применение специальной операции "стрелка" (->). Операция "стрелка" имеет самый высший ранг (см. табл. 1.4) наряду со скобками и операцией "точка". Операция "стрелка" обеспечивает доступ к элементу структуры через адресующий ее указатель того же структурного типа. Формат применения операции в простейшем случае:

указатель_на_структуру -> имя_элемента

Операция "стрелка" двуместная. Применяется для доступа к элементу (к компоненту), задаваемому правым операндом, той структуры, которую адресует левый операнд. В качестве левого операнда должен быть указатель на структуру: в качестве правого - обозначение (имя) компонента этой структуры.

Операция "стрелка" (->) иногда называется операцией косвенного выбора компонента (элемента) структурированного объекта, адресуемого указателем.

Примеры:

Если в программе (см. выше) определены структура point типа struct particle и на нее настроен указатель:

struct particle *pinta = &point;

то будут справедливы следующие равенства:

Изменить значения элементов структуры point в этом случае можно, например, такими операторами:

Тип результата операции "стрелка" (->) совпадает с типом правого операнда, т.е. того элемента структуры, на который "нацелена" стрелка.

Операции над указателями на структуры. Эти операции не отличаются от операций над другими указателями на данные. (Исключение составляет операция "стрелка" (->), но ее мы уже рассмотрели). Если присвоить указателю на структуру конкретного структурного типа значение адреса одного из элементов массива структур того же типа, то, изменяя значение указателя (например, с помощью операций ++ или --), можно равномерно "перемещаться" по массиву структур.

В качестве иллюстрации рассмотрим следующую задачу. Вычислить сумму заданного количества комплексных чисел, представленных в программе массивом array[ ] структур.

Результат выполнения программы:

В программе введен тип struct complex. Определены: массив структур аггау[ ], структура summa, где формируется результат, и указатель point, в начале программы настроенный на первый (нулевой) элемент массива структур, а затем в цикле "пробегающий" по всему массиву. Доступ к структуре summa реализован с помощью уточненных имен (операция "точка"). Доступ к элементам структур, входящих в массив, осуществляется через указатель point и с помощью операции "стрелка" (->).