Динамические структуры и массивы структур
Использование указателей на структуры
Массивы структур
Как видно из шаблона структуры Worker, массивы могут быть элементами структур. В свою очередь и переменные одного и того же структурного типа могут объединяться в массивы. Пример объявления массива структур:
Worker staff [100]; // массив из 100 структур типа Worker
При инициализации массивов структур удобно заключать в фигурные скобки список значений для каждой структуры:
Worker worker[2] = { { 3124, "Ivanoff", 31, 3400.55},
{ 3125, "Petroff", 35, 3900.00} };
Можно не структурировать фигурными скобками данные для инициализации, тогда они будут присваиваться полям структур в порядке их расположения.
Пример доступа к полям массива структур:
staff[8].age = 30;
cout <<staff[5].fio;
char c = staff[7].fio[0];
Можно объявить указатель на структуру:
// определение указателя на тип Worker
Worker *pw;
а затем присвоить ему адрес существующей переменной указанного типа:
pw = &worker; // worker – переменная типа Worker
Объявление и инициализацию указателя, как обычно, можно совместить:
Worker *pw = &worker;
Для доступа к элементам (полям) структуры через указатель используется операция -> (“стрелка”, селектор):
pw->salary = 150000;
1.2.2.3. Об операциях . и –>
Операция –> является кратким способом записи доступа к значению структуры по ее адресу. Другой, более подробный способ записи предыдущего оператора:
(*pw).salary = 150000;
Операции . и –>, наряду с операцией индексирования [], имеют наивысший приоритет среди всех операций (выше, чем унарные).
Поэтому, например, код
Worker *pw = staff;
++pw->code;
увеличит значение переменной code начальной (с нулевым индексом) структуры массива структур staff, а не значение указателя pw.
Память под структуру и массив структур можно выделять динамически:
Worker *pw = new Worker; // выделение памяти для структуры
pw->age=28;
pw->code=3983;
Worker *pwd = new Worker[k]; // выделение памяти для массива из k структур
Освобождение выделенной памяти осуществляется с помощью оператора delete:
delete pw;
delete [] pwd;
Обращение к полям элементов динамического массива структур можно осуществлять любым из возможных способов – с помощью операций индексирования, . или ->, например:
pwd[2].age=28;
(pwd+2)->code=3983;
(*(pwd+2)).salary=35000;
(скобки необходимы, так как приоритет операций . и –> выше, чем приоритет операции *).
Легко догадаться, что способы доступа к полям элементов статического массива структур те же, поскольку массив в C++ реализован как указатель на его начало:
Worker staff[100];
...
int nAge = staff[1].age;
int iCode = (staff+2)->code;
int iAge = (*(staff+2)).age;
Динамический массив структур можно реализовать как массив указателей.
Комбинируя структуры и массивы можно строить достаточно сложные, универсальные и гибкие структуры данных.
В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С.