Материал: Программирование на языке высокого уровня Лекции 09.03.01

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

void giena(void) {x=x-3;

printf(“x=%d\n”,x);

}

Программирование на языке высокого уровня 09.03.01

26

Раздел 3. Типы, определяемые программистом. Лекции 17-19.

Тема 23. Структурные типы данных. Операции над переменными структурных типов.

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

Описание структурного типа начинается с ключевого слова

struct и содержит список описаний, заключенный

в фигурные

скобки. За словом struct следует имя структурного типа.

struct point {

 

int x;

 

int y;

 

};

 

Имя структурного типа может служить кратким

обозначением

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

Аналогично

синтаксису

обычных операторов описания, за

правой фигурной

скобкой

могут следовать имена переменных,

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

struct point {...} x,y,z;

 

int x, y, z;

 

Описание

структурного

типа,

не

содержащее

списка

переменных, не резервирует памяти: оно просто описывает шаблон или образец структурной переменной. Однако, если структурный тип имеет имя, то этим именем можно пользоваться при описании структурных объектов:

struct point pt;

Структурная переменная при ее определении может быть

инициализирована при

помощи списка

инициализаторов, состоящего

из константных выражений:

 

 

 

struct point ttt = {300,400}.

 

 

Инициализировать

структурные

переменные

можно

также

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

Программирование на языке высокого уровня 09.03.01

27

Доступ к отдельному компоненту структурной переменной осуществляется посредством конструкции имя_переменной.компонент.

printf("%d,%d",pt.x,pt.y);

Как указывалось выше,среди компонентов при создании нового структурного типа могут быть и переменные ранее созданных структурных типов:

struct rect{

struct point pt1; struct point pt2;

};

struct rect screen;

Доступ к координате х точки pt1 - screen.pt1.x

Над структурными переменными возможны присваивание, взятие адреса с помощью операции & и осуществление доступа к ее компонентам. Сравнивать структурные переменные нельзя. Частным случаем этих операций является передача структурных переменных функциям и возврат их из функций в виде результата. В функцию можно передавать компоненты структурных переменных по отдельности, всю структурную переменную целиком, а также указатель на структурную переменную.

Пример возврата структурной переменной целиком: main()

{struct rect screen; struct point middle;

struct point makepoint(int,int); screen.pt1=makepoint(0,0); screen.pt2=makepoint(XMAX,YMAX); middle=makepoint((screen.pt1.x+ screen.pt2.x)/2,

(screen.pt1.y+screen.pt2.y)/2);

}

struct point makepoint (int x, int y) {struct point tmp;

tmp.x=x;

tmp.y=y; return tmp; }.

Пример функции, оба аргумента которой и возвращаемое значение – структурные переменные:

struсt point addpoint (struct point p1, struct point

p2)

{p1.x+=p2.x;

p1.y+=p2.y; return p1;

}

Программирование на языке высокого уровня 09.03.01

28

В ряде случаев более эффективной формой обеспечения доступа функции к структурным переменным является передача указателя на структурную переменную. Описания указателя на структурный тип полностью аналогично описанию указателя на любой другой тип данных:

struct point *pp;

(*pp).x и (*pp).y - члены стуктуры.

Наличие скобок существенно из-за того, что приоритет опрератора . выше приоритета оператора *. Запись без скобок

*pp.x будет вообще неверной,

так как pp.x не является

указателем.

Если

используется

указатель

на

структурную

переменную,

то обычно пользуются

иной формой

доступа к ее

членам:

pp->x, pp->y.

Операторы . и -> выполняются слева направо, то есть при наличии описания

struct rect r, *rp=r;

можно обойтись без скобок в выражениях (r.pt1).x и (rp->pt1).x. Операторы доступа к компонентам структурных переменных

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

struct {

int len; char *str;

} *p;

оператор

++p->len;

увеличит на 1 значение компонента len, а не указателя р.

Тема 24. Массивы переменных структурных типов.

При описании

struct key { char *word; int count;

} massiv [100];

будет описан структурный тип key и выделена память под массив с именем massiv, каждый элемент которого является переменной этого типа.

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

Программирование на языке высокого уровня 09.03.01

29

for (i=0;i<100;i++) massiv[i].count++;

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

struct key *p;

for (p=keytab;p<keytab+99;p++) if(p->count>0) printf("%4d%s\n",p->count,p->word);

Используя структурные перемнные и, в особенности, массивы структурных переменных, средствами языка С/С++ можно решать ряд задач обработки таблиц, то есть выполнять часть функций систем управления базами данных.

Тема 25. Объединения. Поля битов.

Объединение - это переменная, которая может в разные моменты времени содержать в себе объекты различных типов и размеров. Размер памяти, выделяемый под объединение, таков, чтобы хватило места под любой член объединения. Синтаксис доступа к членам объединения в точности такой же, как и при работе со структурными переменными.

union room { int giena;

char poleno; float tryp;

}k535;

Вслучае рассогласования типов результат не предсказуем и зависит от реализации (то есть от типа компилятора). За соблюдением этого требования должен следить сам программист, так как рассогласование типов не является синтаксической ошибкой.

Объединения могут являться компонентами структурных переменных и их массивов и, наоборот, объединения могут включать эти компоненты в свой состав. Доступ к членам объединений, входящих в структурные переменные, такой же, как у вложенных структурных переменных. Например, в массиве структурных переменных

struct {

char *name; int flags; int utype; union {

int ival; float fval; char *sval; } u;

Программирование на языке высокого уровня 09.03.01

30

Источник: https://studfile.net/preview/16415559/