8.11. Структуры

 

Описание структуры

 

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

Описание  структуры имеет вид

 

struct {

                   Набор полей структуры

         } список определяемых одновременно структур;

 

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

Например

struct {

                   int year;

                   int month;

                   intday;

                  } data1, data2;

Из определения следует, что каждая из двух переменных data1 и data2 состоит из трех компонентов, year, month и day.

С типом структуры может быть ассоциировано имя, которое задается следующим образом

 

structname {

                            Набор полей структуры

                        };

 

где name является идентификатором.

 

Пример

struct student {

                            char name[25];

                            int age;

                            Int group;

                            };

В приведенном примере описана структура с именем student и полями name, age и group.

С помощью имени структуры можно определять переменные, имеющие тип структуры. Следующим образом:

 

structname список-идентификаторов;

Пример

structstudents1, s2;

 

Переменные s1, s2 – это структуры типа  student.

Как мы уже сказали, компонентом структуры может быть объект любого типа,  кроме функции, в том числе и типа структуры.

Пример

struct student2 {

                            char name[25];

                            int age;

                            struct {

                                     int year;

                                     int month;

                                     intday;

                                     } birthday;

                            };

Здесь описана структура с полями  name, age и birthday, которое в свою очередь тоже является структурой с тремя полями year, monthи day.

Единственное исключение структура S не может содержать компонент, являющийся структурой типа S. Однако структура типа S может содержать компонент, являющийся указателем на структуру типа S.

 

 

Пример

struct node {

                            int data;

                            struct node *next;

                       };

 

Доступ к компонентам структуры

 

Доступ к компонентам структуры осуществляется с помощью операции указания члена структуры ‘.’:

s.c

 

где s является именем переменной имеющей тип структуры, с компонент структуры.

struct student2 s1;

s1.name=”ivanov”;

s1.age=23;

s1.birshday.year=1980;

s1.birshday.month=8;

s1.birshday.day=23;

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

 

Кроме операции указания члена структуры ‘.’, со структурой можно использовать также операцию взятия адреса &.

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

 structstudent2 *pst;

pst=&s1; /*указателю pst будет приписан адрес структуры s1*/

 

В этом случае обращение к полю может иметь один из следующих видов

1. (*pst).name /*скобки обязательны т. к. операция указания члена стуктуры старше чем *                   */

или

2. pst->name

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

 Кроме операций указания члена структуры ‘.’ и взятия адреса структуры c ними нельзя производить никаких операций. Структуры нельзя присваивать одну другой, нельзя передавать структуру как параметр функции.

Пример

struct student2 s2;

s2=s1; /* ошибка*/

 

 

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

 

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

Пример

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

 

1.передадим компонент год даты

voidyear_vys(intyear)

{ if (year%4==0&&year%100!=0||year%400==0) printf(“годвысокосный”);

   elseprintf(“год не высокосный”);

}

structdatad1;

вызов функции будет иметь вид year_vys(d1.year);

2. будем передавать в функцию указатель на структуру

 

void year_vys(struct data *d)

{ if (d->year%4==0&&d->year%100!=0||d->year%400==0) printf(“годвысокосный”);

   elseprintf(“год не высокосный”);

}

structdatad2;

вызов функции будет иметь вид year_vys(&d2);

 

 

К оглавлению

Назад к разделу "8.10 Рекурсивные функции"

Вперед к разделу "8.12. Объединения"