Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 90; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.11 (0.006 с.) |