Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы_по_проге_Берлин / Книги / учебное пособие ОАиП.pdf
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
947 Кб
Скачать

Указатели на структуры.

Как и для других структурированных типов данных, указатели могут быть использованы и для структур. Это имеет следующие положительные черты:

-указателями на структуры легче пользоваться, чем самими структурами (например, в задаче сортировки);

-ряд данных удобно представлять в виде структур, полями которых являются указатели на другие структуры.

Рассмотрим пример, показывающий, как определять указатель на структуру и использовать его для работы с элементами структуры.

#include <stdio.h>

#define DL 30 // max число символов в строке char

struct name{char fio[DL];};

// ФИО объекта

struct inform{struct name nm;

// ссылка на стр-ру name

char prof[DL];

// профессия

int god;

// год рождения

float okl;};

// оклад

void main(void)

 

{static struct inform mas[2]=

{"Иванов","конструктор",1965,15000.50, "Петров","оператор",1967,12350.50};

struct inform *him;

// указатель на структуру

printf("адрес mas[0]: %u

mas[1]: %u \n",&mas[0],&mas[1]);

him=mas;

// him содержит адрес mas[0]

printf("адрес mas[0]: %u

mas[1]: %u \n",him,him+1);

printf("him->okl = %.2f

(*him).okl = %.2f \n",him- >okl, (*him)okl);

him++;

// him содержит адрес следующей стр-ры

printf("him->okl = %.2f

(*him).okl = %.2f \n",him- >okl, *him).okl);

++him->okl;

// увеличение значения поля okl на 1

printf("him->okl = %.2f

(*him).okl = %.2f \n",him- >okl, *him).okl);

}

 

Синтаксис, используемый при описании указателя на структуру, такой же, как и для других структурированных данных:

struct имя_структуры * имя_указателя;

Таким образом, раз him - указатель на структуру inform, то *him есть сама структура, а (*him).okl - одно из полей структуры.

В выражении (*him).okl используются скобки, так как приоритет операции (.) выше чем *. Для упрощения доступа к элементам структуры (избежания ошибок, связанных с учетом приоритета) была введена операция -> (операция косвенного получения элемента). Эта операция имеет следующую форму записи:

имя_указателя -> имя_поля_структуры; Этот оператор состоит из двух знаков - и >. Операция -> имеет

наивысший приоритет, наряду с операциями () [ ] и, таким образом, чтобы перейти к полю okl следующей структуры, необходимо записать: