Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 11 Структуры 2015.doc
Скачиваний:
132
Добавлен:
29.02.2016
Размер:
117.76 Кб
Скачать

Вложенные структуры

Если полем структуры является другая структура, то получается вложенная структура. Определим структуры для времени и даты:

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

Операция разыменования (*) относится к имени указателя, а не к уточнённому имени поля структуры.