Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
21.03.2016
Размер:
6.05 Mб
Скачать

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

Определение структуры вводит новый пользовательский тип в программу, который может быть использован так же, как любой встроенный

тип.

Структура называется вложенной, если хотя бы одно из ее полей является структурой.

Описание вложенной структуры состоит из двух этапов:

1.Описание вкладываемой структуры, т.е. создание нового типа данных.

2. Описание вложенной структуры.

Пример описания вложенной структуры

struct date //Вкладываемая структура

//используется для описания поля birth структуры student

{

 

 

int

day;

// День

int

month;

// Месяц

int

year;

// Год

};

 

 

struct student

//Вложенная структура

{

 

//Одно из ее полей (birth) является структурой

 

 

char fam[30];

//Фамилия

char address[150];

// Домашний адрес

struct date birth;

// Дата рождения

char

phone[10];

// Телефон

int

oc[4];

// Оценки

float

sr;

// Средний балл

};

 

 

Доступ к отдельным полям структурной переменной

Обработка переменной, являющейся структурой, т.е. структурной переменной, сводится к обработке ее полей. При этом поле и сама переменная связываются с помощью составного имени, имеющего следующий синтаксис:

<имя_структурной_переменной>•<имя_поля>

Здесь • - операция выбора или ссылки на поле (обычная точка).

Примеры обращения к полям структуры

Обращение к полю структуры

Комментарий

S1.fam

Фамилия студента S1 4

S1.oc[0]

Первая оценка студента S1

S1.аdress

Адрес студента S1

S1.oc[i]

i-ая оценка студента S1

S1. birth. day

День рождения студента S1

S[3].oc[2]

3-ья оценка 4-го студента

S[57]. birth. year

Год рождения 58-го студента

Совмещение описания шаблона структуры и структурной переменной

Синтаксис описания:

<шаблон структуры><имя переменной или список имен переменных>;

Пример.

 

 

struct date

//Описание шаблона структуры

{

 

 

int

day;

 

int

month;

 

int

year;

 

} d1,d2;

// Список имен переменных

Совмещение описания шаблона, описания структурных переменных и инициализации полей в

одном предложении

Пример 1.

struct date

{

int

day;

// День

int

month;

// Месяц

int

year;

// Год

} d1, d2={2,3,1987};

Здесь описаны две переменные-структуры (d1 и d2).

При этом сразу определены значения полей переменной d2:

d2. day=2;

d2. month=3;

d2. year=1987;

Т.о., дата d2 - это 2 марта 1987 года

 

Пример2

struct student

 

{

 

 

char

fam[30];

//Фамилия

char

address[150];

// Домашний адрес

struct date birth;

// Дата рождения

char

phone[14];

// Телефон

int

oc[4];

// Оценки

float

sr;

// Средний балл

}

 

 

S1={ "Петров",

"г. Жлобин, ул. Строителей, д.2,

кв.4",

{8,12,2009},

"+3750232483580",

{9,8,5,7},

0

};

Определение объема памяти, выделяемой под структурную переменную

Число байтов, выделенное под структурную переменную, не всегда равно сумме длин отдельных ее полей из-за некоторых особенностей работы процессора с данными с фиксированной и

плавающей точкой, что приводит к так называемому "выравниванию", размещению элементов с четного адреса. Выделение памяти осуществляется по шаблону в последовательности объявления ее полей.

Для определения объема памяти, выделяемой под структурную переменную, используется стандартная функция sizeof:

sizeof ( struct <имя_шалона> );

Примеры:

sizeof ( struct date ); sizeof ( struct student );

Копирование структур-переменных

С помощью оператора присваивания можно копировать значения одной структуры-переменной в другую при условии, что обе структуры- переменные имеют один и тот же тип. Например, пусть переменные a1,

a2 описаны следующим образом:

struct complex

{

float

re; // Действительная составляющая комплексного числа

float

im; //Мнимая составляющая комплексного числа

} a1, a2;

 

Пусть a1.re=3.5; a1.im=0.34; (a1=3.5+0.34i)

После выполнения оператора a2=a1 окажется, что a2.re равно 3.5, a2.im равно 0.34 (a2=3.5+0.34i)

Примечание. При копировании структур-переменных оператор присваивания выполняет поверхностное копирование, суть которого состоит в следующем. Происходит копирование бит за битом значений полей переменной-источника (a1) и перенесение их в соответствующие поля переменной-цели (a2). При этом может возникнуть проблемы с такими полями данных, как указатели. Поэтому использовать поверхностное копирование структур надо осторожно.

Структурные переменные и указатели

Предположим, что в программе сделано описание:

struct vec

{

double x, y;

};

vec v1, *v2;

Здесь v1 структура типа vec, v2 – указатель на структуру типа vec, *v2 – сама запись.

Конструкции для выбора полей x, y :

(*v2).x, (*v2).y

Или с использованием специальной операции -> (минус больше):

v2->x, v2->y

Массивы структурных переменных

Описание массива структур не отличается от описания массива обычных переменных.

Пример:

Struct Man

{

char

fio[31];

// ФИО

int

year;

// Год рождения

float

pay;

// Оклад

};

 

 

Man d[100], *p=d;

//d - массив структур из 100 элементов

//p - указатель, инициализированный адресом

//первого элемента массива d

Примеры обращения к полям:

d[i].year, (*(d+i)).year, (d+i)->year, ( p+i)-> year

Соседние файлы в папке ЭУМК_ОАиП__PDF