Вложенные структуры
Если полем структуры является другая структура, то получается вложенная структура. Определим структуры для времени и даты:
struct Time{
int hour, min, sec;
};
struct Date{
int day, month, year;
};
Теперь можно построить вложенную структуру DateTime:
struct DateTime{
Date today;
Time now;
};
Доступ к полям вложенной структуры осуществляется с помощью нескольких операций точка (.). Например, если объявить переменную dt:
DateTime dt;
то можно записать следующие операторы:
dt.today.year = 2011;
dt.hour.minute = 33;
Массивы в структурах
Полем структуры может быть одномерный или двумерный массивы фиксированной размерности. Например:
struct Matr{
int a[2][3];
float b[3];
char fio[20];
};
.....
Matr st;
st.a[0][0] = 25; cout<<st.a[i][j];
cin>>st.b[2]; st.fio[0] = '*';
Массив структур
Синтаксис объявления массива структур совершенно аналогичен объявлению массива любого другого типа. Сначала необходимо определить структурный тип, а затем объявить массив переменных данного типа. Например:
struct Date{
int day, month, year;
};
struct Person{
char fam[20];
Date birthday; // вложенная структура Date
long telNumber;
};
Date list[10]; // объявлен массив структур list
const n = 100;
Person p1[n]; // объявлен массив структур p1
Matr a[n]; // объявлен массив структур a
…
Для доступа к полям структур элементов массива имя массива структур индексируется, и затем через операцию точка (.) указывается поле структруры:
cin>>list[1].day;
cin>>list.day[2]; // нельзя
cout<<p1[i].birthday.day;
matr[0].a[0][1] = 25;
Структуры и указатели Указатели в структуре
Полями структуры могут быть указатели. Например:
struct Str{
int * x;
int * y;
char * c;
}st;
Перед использованием структуры st её поля-указатели необходимо проинициализировать:
в качестве значения поля x структуры st можно использовать адрес ранее определенной переменной:
int z; st.x = &z;
Доступ к содержимому памяти, адрес которой находится в поле x структуры st выполняется с помощью операции разыменования (*):
*st.x = 5; int g = *st.x; // символ * относится к x
для инициализации можно использовать операцию new:
st.x = new int;
st.y = new int[k];
st.c = new char[20];
В первом операторе адрес динамической int-переменной записывается в поле x cтруктуры st. Во втором операторе резервируется память для размещения динамического массива из k целых чисел и адрес первого элемента массива записывается в поле y структуры st. После этого, например, можно вводить элементы массива:
for(int i = 0; i < k; i++) cin>>st.y[i];
В третьем операторе резервируется память для размещения массива из 20 символов и адрес первого байта записывается в поле с структуры st. Доступ к элементам массива с:
st.c[k], st.c[0] и т.д.
Указатель на структуру
Можно объявить указатель на структуру по обычным правилам:
Date * p1; Person * p2; Str * p3;
Инициализацию указателя на структуру можно выполнить одним из следующих способов:
адрес структуры определить с помощью операции new:
Date * uk = new Date;
указателю на структуру присвоить адрес ранее объявленной структуры:
Date st; Date * uk = &st;
использовать имя ранее объявленного массива структур:
const int n = 5; Date st[n]; Date * uk = st;
Значением указателя на структуру является адрес структуры, т.е. номер байта, начиная с которого структура размещается в памяти.
Для доступа к полям структуры через указатель на структуру имеется две возможности:
вместо операции точка (.) использовать операцию стрелка (->), например:
struct Person{
char fam[20];
long telNum;
};
Person * uk = new Person;
uk-> telNum = 2034870; cin>>uk->fam;
выполнить разыменование указателя и формирование уточненного имени, например:
(*uk).telNum = 2034870; // символ * относится к uk
Операция разыменования (*) относится к имени указателя, а не к уточнённому имени поля структуры.