Структуры и объединения Структуры —
Структуры и объединения
Структуры - это составной объект, в который входят элементы любых типов, за исключением функций.
В отличие от массива, который является однородным объектом, структура может быть неоднородной. Тип структуры определяется записью вида: struct { список определений }
Пример: struct { double x, y; } s 1, s 2, sm[9]; Переменные s 1, s 2 определяются как структуры, каждая из которых состоит из двух компонентов: х и у. Переменная sm определяется как массив из девяти структур.
Способ ассоциирования имени с типом структуры основан на использовании тега структуры. Тег структуры определяется следующим образом: struct тег { список описаний; }; где тег является идентификатором.
Пример: идентификатор student описывается как тег структуры: struct student { char name[25]; int id, age; char prp; };
Тег структуры используется для последующего объявления структур данного вида в форме: struct тег список-идентификаторов; Пример: struct student st 1, st 2;
Рекурсивные структуры Использование тегов структуры необходимо для описания рекурсивных структур. struct node { int data; struct node * next; } st 1_node;
Структуры не могут быть прямо рекурсивными, т. е. структура node не может содержать компонент, являющийся структурой node, но любая структура может иметь компонент, являющийся указателем на свой тип.
Доступ к компонентам структуры осуществляется с помощью указания имени структуры и следующего через точку имени выделенного компонента, например: st 1. name="Иванов"; st 2. id=st 1. id; st 1_node. data=st 1. age;
Объединение подобно структуре, однако в каждый момент времени может Объединения (смеси) использоваться только один из элементов объединения. Тип объединения может задаваться в следующем виде: union { описание элемента 1; . . . описание элемента n; };
Главная особенность объединения: для каждого из объявленных элементов выделяется одна и та же область памяти, т. е. они перекрываются.
Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат не был бессмысленным.
Доступ к элементам объединения осуществляется тем же способом, что и к структурам. Тег объединения может быть формализован точно так же, как и тег структуры.
Память, которая соответствует переменной типа объединения, определяется величиной, необходимой для размещения наиболее длинного элемента объединения.
Пример: union { char fio[30]; char adres[80]; int vozrast; int telefon; } inform; union { int ax; char al[2]; } ua;
При использовании объекта inform типа union можно обрабатывать только тот элемент, который получил значение. Например, после присвоения значения элементу inform. fio не имеет смысла обращаться к другим элементам.
Объединение ua позволяет получить отдельный доступ к младшему ua. al[0] и к старшему ua. al[1] байтам двухбайтного числа ua. ax.
Переменные с изменяемой структурой Часто некоторые объекты программы относятся к одному и тому же классу, отличаясь лишь некоторыми деталями.
Пример: Рассмотрим представление геометрических фигур. Общая информация о фигурах может включать такие элементы, как площадь, периметр. Однако соответствующая информация о геометрических размерах может оказаться различной в зависимости от их формы.
Пример комбинированного использования структуры и объединения struct figure { double area, perimetr; // общие компоненты int type; // признак компонента union // перечисление компонент { double radius; // окружность double a[2]; // прямоугольник double b[3]; // треугольник } geom_fig; } fig 1, fig 2 ;
В общем случае каждый объект типа figure будет состоять из трех компонентов: area, perimetr, type.
Компонент type называется меткой активного компонента, так как он используется для указания, какой из компонентов объединения geom_fig является активным в данный момент.
Такая структура называется переменной структурой, потому что ее компоненты меняются в зависимости от значения метки активного компонента (значение type).
Что выведет программа? struct man { char name[20]; int salary; } workers[] = { "Иванов", 200 }, { "Петров", 180 }, { "Сидоров", 150 } }, *wptr, chief = { "начальник", 550 };
main() { struct man *ptr, *cptr, save; ptr = workers + 1; cptr = &chief; save = workers[2]; workers[2] = *wptr; *wptr = save; wptr++; ptr--; ptr->salary = save. salary;
printf( "%c %s %sn%d %d %d %dn%d %d %cn", *workers[1]. name, workers[2]. name, cptr->name, ptr[1]. name, save. name, wptr->salary, chief. salary, (*ptr). salary, workers->salary, wptr - ptr, wptr - workers, *ptr->name ); }
Ответ: С Петров начальник Сидоров 180 550 150 2 2 И
Структуры и объединения.ppt
- Количество слайдов: 28

