Шаг 83.
Операции над структурами

    На этом шаге мы перечислим операции над структурами.

    Перечислим операции, которые допустимы над структурами.

  1. Доступ к элементу структуры с помощью операции "." (точка).
  2. Доступ к элементу структуры по указателю с помощью операции "->" в виде: <указатель на структуру> -> <элемент_структуры>. Так, обращения pd->year и (*pd).year эквивалентны. Круглые скобки (*pd) необходимы, поскольку операция "." доступа к элементу структуры старше, чем "*".
  3. Определение адреса структуры с помощью операции "&".
  4. Инициализация структур внешнего и статического класса памяти;


        Пример 1.
    #include <iostream.h>
    //Описание шаблона внешней структуры с именем date.
    struct date
    { int day; 
      int month; 
      int year; 
      char mon_name[12];
    };
    //Инициализация внешней структуры d.
    date d = { 2,5,1776,"июль" }; //d - внешняя переменная типа date.
    void main ()
    {
      struct date *p; // Указатель p указывает на структуру  типа date.
      cout << d.day << " " << d.year << " " 
         << d.month << " " << d.mon_name;
      p = &d;
      cout << "\nПроверка доступа к структуре по указателю: \n";
      cout << p->day << " " << p->month << " " 
         << p->year << " " << p->mon_name;
    }
    
    Текст этой программы можно взять здесь.
  5. Присваивание структуры как единого целого.


        Пример 2.
    #include <iostream.h>
    struct date //Описание шаблона внешней структуры с именем date.
    { int day; 
      int month; 
      int year; 
      char mon_name[12];
    };
    date a = { 14,7,1954,"июль" };
    date b;
    void main ()
    {
       cout << a.day << " " << a.year << " "
        << a.month << " " << a.mon_name << endl;
       b = a;
       cout << "Проверка: \n";
       cout << b.day << " " << b.year << " " 
          << b.month << " " << b.mon_name << endl;
    }
    
    Текст этой программы можно взять здесь.
  6. Передача структуры в качестве параметра функции и возвращение структуры в результате работы функции.
  7. Передача отдельных компонент структуры в качестве аргументов функции. Например, для функции day_of_year1:
       int day_of_year1 (int day,int month,int year)
       { 
         //Вычисление дня в году с помощью месяца и года.
         int i, leap;
         leap = year%4==0 && year%100!=0 || year%400==0;
         for (i=1; i < month; i++) 
               day += day_tab[leap][i];
         return (day);
       } 
    

    возможно обращение в виде: d.yearday = day_of_year1 (d.day,d.month,d.year);. Рассмотрим порядок выполнения некоторых наиболее распространенных операций над элементами структуры на примере следующего описания:

      struct
       {
         int x;
         int *y;
       } *p; // p - указатель на структуру.
    

    Тогда:

    • (++p)->x - операция увеличивает p до доступа к x;
    • (p++)->x - операция увеличивает p после доступа к x (круглые скобки не обязательны, так как по старшинству раньше будет применена операция "->");
    • *p->y - выбирается содержимое объекта, на который указывает y;
    • *p->y++ - увеличивается y после обработки того, на что он указывает (аналогично *s++);
    • *p++->y - увеличивает p после выборки того, на что указывает y;
    • (*(*p).y)++ - увеличивает то, на что указывает y.

    Можно отметить одно очень важное использование структур: создание новых типов данных. Существуют типы данных, гораздо более эффективные при решении определенных задач, чем массивы и структуры. Это очереди, двоичные деревья, множества, таблицы и графы. Многие из этих типов создаются из "связанных" структур. Обычно каждая такая структура содержит один или два типа данных плюс один или два указателя на другие структуры такого же типа. Указатели служат для связи одной структуры с другой и для обеспечения пути, позволяющего вести поиск по всей структуре.

    На следующем шаге мы поговорим об использовании полей битов в качестве полей структур.


Предыдущий шаг Содержание Следующий шаг