Процедурное программирование на языке С. Часть 3. Файлы и структуры: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 13

   char  pol;   char adres[40];   float summa;};

Второй способ    typedef struct

  { int  tab_number;   char fio[50];   char data[10];

   char  pol;   char adres[40];   float summa; } sotrudnik_2 ;

Замечание.   Эти два способа различаются только тем, что в первом случае создается тип данных – struct sotrudnik_1, а во втором – sotrudnik_2. Шаблоны обеих структур одинаковы, т.е. одинаковыми являются соответствующие компоненты обеих структур (имена компонент, их типы и общее количество).

Конкретные экземпляры структур создаются (т.е. им присваиваются имена и для них выделяются участки памяти) в соответствии с обычным оператором объявления:

< спецификации типа > <идентификатор>;  –

где < спецификации типа > –  тип данных “структура”, созданный при помощи шаблона, <идентификатор>  –  имя конкретного экземпляра-структуры.

В примере 7.7  объявляются экземпляры структур с  типами,  созданными в примере 7.6.

Пример 7.7.

structsotrudnik_1 str1;

sotrudnik_2 str_1;

structsotrudnik_1  str[30];

sotrudnik_2     st_r[30];

В соответствии с каждым из первых двух операторов объявляются структуры  с именами strи str_1, для каждой из них выделяется участок памяти размером (sizeof(int) + 50* sizeof(char)  + 10* sizeof(char)  + sizeof(char)   + 40* sizeof(char)   + sizeof(float) ) байт. В соответствии с каждым из вторых двух операторов объявляются массивы из 30 структур, для каждого массива выделяется участок памяти размером 30*(sizeof(int) + 50* sizeof(char)  + 10* sizeof(char)  + sizeof(char)   + 40* sizeof(char)   + sizeof(float) ) байт.

Элементом структуры может быть любая структура. В частности, для структуры, предназначенной для хранения информации о сотруднике, поле fio (как и поля data и adres) может само быть структурой. Пример 7.8 демонстрирует такую возможность.

Пример 7.8.

typedefstruct

  { charsurname[25];   charname[15];

charpatronymic[20];} fio_sotrud;

typedef struct

   {int day;   int month;   int year;} data_birth;

 struct adres_sotrud

    { char town[30];   char street[40];   int house;

  int building;  int flat;};

struct sotrudnik_3

  { int  tab_number;

    fio_sotrud fio;

    data_birth  data;

    char  pol;

struct adres_sotrud adres;

   float summa;

} STR_SOT;

В соответствии с оператором объявления структуры STR_SOT выделяется участок памяти размером (sizeof(int) + sizeof(fio_sotrud)+ sizeof(data_birth)+ sizeof(char) + sizeof(struct adres_sotrud) + sizeof(float) ) байт.

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

Пример 7.9.

structsotrudnik_3* ptr;

ptr =( structsotrudnik_3*)malloc(3*sizeof(structsotrudnik_3));

После вызова функции malloc() выделяется участок памяти размером     3* sizeof(structsotrudnik_3), начальный адрес данного участка – значение переменной ptr.

7.5. ДОСТУП К ЭЛЕМЕНТАМ СТРУКТУР

Доступ к элементам статических структур, созданных в примерах 7.7 и 7.8, осуществляется при помощи операции ‘.’. Выражение, реализующее доступ, имеет форму:

< имя структуры >.<имя элемента>. Причем перед ‘.’ указывается не тип данных – структура, а имя конкретной структуры, для которой уже выделен участок памяти.

В примере 7.10 демонстрируются варианты доступа (занесения и извлечения информации) к некоторым элементам структур.

Пример 7.10.

#include <stdio.h>

#include <string.h>

void main (void)

{  typedef struct

        { char surname[25];

          char name[15]; 

          char  patronymic[20];  }   fio_sotrud;

   typedef struct

     { int day;   int month;    int year;  }    data_birth;

  struct sotrudnik_3

       { int  tab_number;         fio_sotrud fio;

        data_birth  data;        char  pol;