Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по С++.doc
Скачиваний:
28
Добавлен:
25.03.2015
Размер:
782.85 Кб
Скачать

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

Обращение к элементам структур производится посредством:

а) операции принадлежности (.) в виде:

имя_структуры_или_объединения.имя_элемента

или

(*указатель_структуры_или_объединения).имя_элемента

б) операции косвенной адресации (->) в виде:

указатель_структуры_или_объединения -> имя_элемента

Например:

Объявляем переменную и указатель на переменные структуры

Stud_Types1, *s2;

обращаемся к полям структуры:

s1. Number;

s1. Fio;

s1. S_b;

или

s2 -> Number,

s2 -> Fio;

s2 ->S_b;

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

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

Например, в структуреperson, содержащей Ф.И.О. и дату рождения, сделать дату рождения внутренней структуройdateпо отношению к структуре person. Шаблон такой конструкции будет выглядеть следующим образом:

structdate

{

intday,month,year;

};

struct person

{

char fio[40];

struct date f1;

} ;

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

struct person a, *p;

Инициализируем указатель pадресом переменнойа:

p = &a;

Тогда обращение к полям структурной переменной aбудет следующим:

a .fio

a.f1.day

a.f1.month

a.f1.year

или

p->fio

p->f1.day

p->f1.month

p->f1.year

Использование typedef

Использование typedef упрощает определение структурных переменных, например:

typedef struct person

{

char fio[40];

int day, month, year;

} W ;

здесь W- созданный пользователем тип данных -структура с указанными полями,и для нашего примера:

Wt1, t2; - декларация двух переменныхt1,t2 типаW.

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

Структурный тип может быть использован для декларации массивов, элементами которых являются структурные переменные, например:

struct person spisok[100]; - spisok - массив структур;

или

struct person

{

char fio[40];

int day, month, year;

} spisok[100];

В данном случае обращение к полю, например, day i-й записи может быть выполнено одним из следующих способов:

spisok[i].day *(spisok+i).day (spisok+i)->day.

Размещение структурных переменных в памяти

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

  • структурные переменные, являющиеся элементами массива, начинаются на границе слова, т.е. с четного адреса;

  • любое поле структурной переменной начинается на границе слова, т.е. с четного адреса и имеет четное смещение по отношению к началу переменной;

  • при необходимости в конец переменной добавляется пустой байт, чтобы общее число байт было четное.

Некоторые особенности:

  1. поля структуры, как правило, имеют разный тип, кроме функций, файлов и самой этой структуры;

  2. поля не могут иметь атрибут класс памяти, данный атрибут можно определить только для всей структуры;

  3. идентификаторы как самой структуры, так и ее полей могут совпадать с идентификатарами других объектов программы, т.к. шаблон структуры обладает собственным пространством имен;

  4. при наличии в программе функций пользователя шаблон структуры рекомендуется поместить глобально перед определениями всех функций, в этом случае он будет доступен всем функциям.

  5. Элементы структур в общем случае размещаются в памяти последовательно с учетом выравнивания начальных адресов. Выравнивание - установка значения адреса, кратного некоторой величине, определяемой собенностями адресации данных на аппаратном уровне.