Динамические структуры и массивы структур

Использование указателей на структуры

Массивы структур

Как видно из шаблона структуры 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++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С.