Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

14.2.Структуры и функции

Рассмотрим несколько функций, манипулирующих точками и прямоугольниками.

// make_point: создание точки

point make_point(int x, int y)

{

point tmp;

tmp.x = x; tmp.y = y;

return tmp;

}

Здесь внутри функции создается локальная структура tmp, ее членам присваиваются значения. Затем с помощью return значение структуры возвращается из функции, после чего работа функции завершается, и локальная структура tmp уничтожается. Значение структуры, возвращенное из функции, может быть присвоено какой-то структурной переменной в вызывающей программе.

Следующая функция создает прямоугольник по двум точкам p и q:

// make_rect: создание прямоугольника

rect make_rect(point p, point q)

{

rect tmp;

tmp.pt1 = p; tmp.pt2 = q;

return tmp;

}

Здесь внутри функции создается локальная структура tmp, полям которой присваиваются значения структур p и q. При присваивании структур производится почленное копирование.

Возможно, что точка pt1 не лежит ниже и левее, чем pt2. Следующая функция преобразует прямоугольник к каноническому виду.

#define max(a, b) (a)>(b)?(a):(b) // Макрос для выбора максимума

#define min(a, b) (a)<(b)?(a):(b) // Макрос для выбора минимума

// canon_rect: канонизация координат прямоугольника

rect canon_rect(rect r)

{

rect tmp;

tmp.pt1.x = min(r.pt1.x, r.pt2.x);

tmp.pt1.y = min(r.pt1.y, r.pt2.y);

tmp.pt2.x = max(r.pt1.x, r.pt2.x);

tmp.pt2.y = max(r.pt1.y, r.pt2.y);

return tmp;

}

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

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

Объявление

point* pp;

сообщает, что pp есть указатель на структуру point. Если pp ссылается на структуру, то выражение

*pp

есть сама структура, а выражения

(*pp).x, (*pp).y

являются членами структуры. Скобки в выражении (*pp).x необходимы, так как приоритет оператора точка (.) выше, чем приоритет оператора звездочка (*) и выражение *pp.x будет проинтерпретировано как *(pp.x), что неверно, так как pp не структура, а pp.x не является указателем.

Пусть имеем фрагмент программы:

point origin, *pp; // Структура и указатель на структуру

pp = &origin; // Указателю pp присвоен адрес структуры origin

Напечатать координаты точки origin можно следующим образом:

cout << ”origin: (” << (*pp).x << ”, ” << (*pp).y << ”)”;

Для доступа к членам структуры через указатель существует специальный оператор стрелка, образованный символами минус и больше:

->

Если p – указатель на структуру, то выражение

p->ЧЛЕН_СТРУКТУРЫ

есть ее отдельный член, поэтому напечатать координаты точки origin можно инструкцией:

cout <<”origin: (” << pp->x << ”, ” << pp->y << ”)”;

Операторы точка (.) и стрелка (->) имеют одинаковый приоритет и выполняются слева направо. Пусть, например, сделаны объявления:

rect r, *pr = &r;

Следующие выражения эквивалентны:

r.pt1.x, pr->pt1.x, (r.pt1).x

С помощью функции make_point можно динамически инициализировать структуры. Например, следующая функция получает в качестве аргумента указатель на структуру rect, внутри функции создается точка, динамически инициализируемая вызовом функции.

// cetner_rect: возвращает точку - центр прямоугольника

point center_rect(rect* pr)

{

point tmp =

make_point((pr->pt1.x + pr->pt2.x) / 2, (pr->pt1.y + pr->pt2.y) / 2);

return tmp;

}