Слайд 2Что такое структура?
В языке Си, структура (struct) — композитный тип данных, инкапсулирующий
без сокрытия набор значений различных типов. Порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через указатели)
Слайд 3Структура
Имеет фиксированный размер
Тот же набор байт только больше
Создание на стеке
Создание в сегменте
данных
Создание массивов
Создание указателя на структуру
Динамический массив
Слайд 6Структура в памяти
Int a;
float b;
double c;
Int
float
double
Сплошная область памяти в 18 байт
Слайд 7Размещение структуры
Локально
Глобально
Слайд 8Первичная инициализация.
Создание экземпляра структуры придерживается тем же правила что и создание переменных:
Глобальные
объявления зануляются(т.к. выделены в сегменте данных), а значит все переменные внутри так же равняются нулю
При локальном объявлении(в теле функции) память резервируется в стеке а значит поля структуры будут инициализированы мусором.
Слайд 9Первичная инициализация
При такой инициализации, явно не инициализированные поля
будут приравнены к нулю
Слайд 10Практика
Напишем функцию которая распечатает данные структуры Person состоящую из полей: firstName, lastName,
age, sex
Слайд 11#define
Директива #define определяет идентификатор и последовательность символов, которой будет замещаться данный идентификатор
при его обнаружении в тексте программы. Стандартный вид директивы следующий:
#define имя_макроса последовательность_символов
Слайд 13typedef
Объявление typedef, которое содержит имя, которое внутри своей области является синонимом для
типа, указанного частью объявления type-declaration.
Слайд 15Динамическое выделение памяти под структуры
Слайд 16Не все так очевидно
Сколько весит структура?
8 байт
8 байт
8 байт
Слайд 17Выравнивание данных
Смещение данных в структуре до адреса кратного их размеру.
Слайд 18Скучный Интересный факт
На процессорах x86 и ARM примитивные типы не могут находиться
в произвольной ячейке памяти. Каждый тип, кроме char, требует выравнивания. char может начинаться с любого адреса, однако двухбайтовый short должен начинаться только с четного адреса, четырехбайтный int или float — с адреса, кратного 4, восьмибайтные long или double — с адреса, кратного 8. Наличие или отсутствие знака значения не имеет. Указатели — 32-битные (4 байта) или 64-битные (8 байт) — также выравниваются.
Слайд 20Можно но не нужно
Можно убрать выравнивание с помощью выражения
#pragma pack(1)
Слайд 21Оптимизация
Данные отсортированы по объему, от большего к меньшему
Слайд 22Списки
Структуры не могу содержать в себе другие структуру того же типа, но
могут содержать ссылки на них.
Слайд 23Списки
Список – цепочка элементов связанных между собой ссылками
Слайд 24Посмотрим на практике.
Напишем программу в которую можно вводить не *ограниченное кол-во координат
точек, концом ввода будет отрицательное число, после чего программа распечатывает все точки.
Слайд 25Виды списка
Односвязные – каждый элемент списка имеет ссылку лишь на следующий элемент.
Двусвязные
– каждый элемент списка имеет ссылку на следующий и предыдущий элементы.