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

        char adres[300];        float summa;    }              STR_SOT, str_S[4];

 STR_SOT.tab_number = 1;

                     printf("  N = %d  ",STR_SOT.tab_number);

   strcpy(STR_SOT.fio.surname,"Sidorov");

                    printf("  surname = %s  ",STR_SOT.fio.surname);

   STR_SOT.data.day = 25;    STR_SOT.data.month = 5;

   STR_SOT.data.year = 1984;

                    printf("\n data_birth:  %2d.%2d.%4d",STR_SOT.data.day,

                                 STR_SOT.data.month,STR_SOT.data.year);

   strcpy(STR_SOT.adres,"Moskva, Vavilova, 1 - 23");

                    printf("\n adres:  %s  ",STR_SOT.adres);

str_S[1].tab_number = 2;

                    printf("\n N = %d  ",str_S[1].tab_number);

   strcpy(str_S[1].fio.surname,"Petrov");

                   printf("  surname = %s  ",str_S[1].fio.surname);

}

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

< указатель на структуру > -> <имя элемента>.

Операция ‘->’  –  двуместная операция доступа к элементу, задаваемому правым операндом выражения. Структуру, к элементу которой осуществляется доступ, адресует левый операнд выражения.

При использовании операции -> следует придерживаться двух основных правил:

·  Тип результата операции ‘->’ совпадает с типом правого операнда, т.е. того элемента структуры, на который «нацелена» стрелка.

·  Операции доступа ‘->’ и ‘.’ имеют самый высокий ранг наряду с квадратными скобками ‘[ ]’ (индексированием массива) и круглыми скобками ‘( )’ (обозначением функции).

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

Пример 7.11.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

void main (void)

{   char NM[] = "Sergej Petrovich";    int i;

 struct sotrudnik

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

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

     ptr =( struct sotrudnik*)malloc(3*sizeof(struct sotrudnik));

    (ptr+2)-> tab_number = 2;

    strcpy((ptr+2)->fio,"Sidorov");

               (ptr+2)->fio[7] = ' ';

             for (i=0; NM[i]; i++)           (ptr+2)->fio[8 + i] = NM[i];

             (ptr+2)->fio[8 + i] = '\0';

              (ptr+2)->summa = 20000.8;

     printf("\n N = %d  ",(ptr+2)-> tab_number);

     printf("  fio: %s  ",(ptr+2)->fio);

     printf("\n zarplata: %f  ",(ptr+2)->summa);

}

В случае, когда элементом структур в динамическом массиве является структура, в выражении, соответствующем операции доступа к такому элементу, знак ‘->’ можно использовать только перед переменной-указателем. 

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

В примере 7.12 структура типа structpersonиспользуется для хранения следующих данных о сотруднике: фамилия, количество отработанных месяцев, зарплата за каждый месяц. Первое поле структуры предназначено для хранения адреса символьного массива – фамилии, третье – адреса массива переменных типа float, значение i-ого элемента этого массива – зарплата за i-ый месяц работы. Во втором поле - количество месяцев.

Пример 7.12.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

void main (void)

{ struct person

       {char * str;    int n;    float * wages;  } *pp;      int i;