Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Расположение структурных переменных в памяти
Изучая структуры, имеет смысл обращать внимание на их представление в памяти компьютера. Порядок описания полей в определении структурного типа задаёт порядок их расположения в памяти. Рассмотрим структуру: struct { long L; int i1, i2; char c[4]; } STR1;
В памяти каждый элемент имеет свое место, и размещаются они последовательно: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff long L int i1 int i2 char c[4]
Компилятор выделяет под структурную переменную STR1 число байтов памяти, достаточное для хранения всех ее полей. Однако выделенное количество байт не всегда равно сумме длин отдельных полей из-за влияния дополнительного фактора внутреннего представления структурных переменных, называемого выравниванием. При выравнивании на границе байта отдельные поля структурной переменной в памяти располагаются без зазоров, с любого четного или нечетного адреса; размер занимаемой структурной переменной памяти равен сумме размеров полей шаблона структуры. Выравнивание на границе байта устанавливает директива препроцессора При выравнивании на границе слова компилятор при размещении структурной переменной в памяти может вставлять между полями пустые байты для того, чтобы соблюдались следующие правила: · отдельная структурная переменная (элемент массива структурных переменных) начинается на границе слова; · любое поле, тип которого не совпадает с типом char, будет начинаться на границе слова; · при необходимости в конце структурной переменной добавляются байты.
Расположение в памяти структурной переменной STR2 при наличии выравнивания на границе 4 –х байт: struct { long L; char c[3]; int i1, i2; } STR2; f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff long L char c[3] int i1 int i2
Сумма размеров элементов структуры (4+3+4+4=15) меньше, чем отведено структуре в целом (16) из-за того, что размер массива char c[3]; не кратен длине слова компьютера и перед элементом int i1 для выравнивания вставлен пустой байт.
Выделенное число байт возвращает операция sizeof. Инициализация структурных переменных Разрешается выполнять инициализацию полей структурной переменной при её определении. Например:
struct Book {char name[20]; //определение шаблона структуры char title[44]; int year; float price; };
Book // инициализация структурных переменных при их определении first_book = {"Mitchel M.", "Unesennie vetrom", 2007, 20000 }, child_book = {"Troepolskij G.", "Belij Bim Chernoe Ucho", 2006, 10000 }, dog_book = {…..};
Инициализирующие значения располагаются в порядке объявления полей в структурном типе. Типы инициализирующих значений должны быть совместимы с типами соответствующих полей в определении структурного типа.
Вложенные структуры Поле, являющееся структурой, называют вложенной структурой. Естественно, что шаблон вкладываемой структуры должен быть уже известен компилятору. Например: struct UDC { char class, subclass; int number; }; struct Book { struct UDC udc_class; char name [20]; char title[44]; int year; float price; } first_book, child_book, dog_book;
Ссылка на поле вложенной структуры формируется из имени структурной переменной, имени структурного поля и имени вложенной структуры. Перечисленные имена разделяются символом «точка». Например: first_ book. udc_ class. class = ‘A’; // ( first_book. udc_class ). class. dog_book. udc_class. number = 681; child_ book. udc_ class. class = 65; //объяснить, почему верно
Теоретически не существует ограничения на величину уровня вложенности структур.
Пусть имеем вложенные структуры: struct Distance //длина в километрах и метрах { int km, m; }; struct Pole //размеры прямоугольного поля { Distance length;
Distance width, };
Тогда инициализация структурной переменной типа Pole выглядит так: Pole pole = { { 2, 20 }, { 1, 5 }};
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 31; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.172.115 (0.008 с.) |