. Лекция 6. Пользовательские типы данных¶
Лекция 6. Пользовательские типы данных¶

Лекция 6. Пользовательские типы данных¶

Использование только стандартных типов в программе уменьшает её возможности.

Стандартные типы не обладают информативностью.

Нестандартные типы данных получаются с помощью специальных механизмов.

стандартные (встроенные) - числовые (char, short, long, int, . )

  • псевдонимы (typedef)
  • перечисления (enum)
  • структуры (struct)
  • объединения (union)
  • поля битов
Описания нестандартных типов¶

Описания нестандартных типов обычно размещают:

  • В начале программы (до первого использования).
  • В заголовочных файлах.
Псевдонимы¶
  • для сокращения длинных объявлений
  • для повышения наглядности
  • для создания переносимых программ
Упрощение сложных объявлений¶

Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char.

Можно объявить этот массив так:

А можно воспользоваться typedef:

Перечисления¶
  • для улучшения типизации
  • для повышения наглядности

Основой для внутреннего представления перечислимого типа является тип int.

Слабая типизация С позволяет смешивать в программе числовые константы и перечислимые типы, а также использовать арифметические операции (++).

В С++ (с сильной типизацией) данный пример вызовет ошибку и будет требовать перегрузки арифметического оператора ++ для перечислимого типа.

Как связать перечисление со строкой¶

Составные типы¶

Структуры¶ Записи¶

Структура (запись) представляет собой набор данных, хранящихся в памяти в смежных адресах, но не обязательно принадлежащих одному типу. Это позволяет рассматривать саму структуру как универсальный тип для представления внутреннего устройства множества объектов.

Изображение структуры (записи):

Фундаментальные структуры данных¶

Замечательно то, что массивы и записи можно объединять, создавая:

  • Массивы записей.
  • Записи, содержащие массивы.

На основе массивов и записей строят:

  • Связанный список - набор элементов одного типа, не обязательно следующих в памяти друг за другом и связанных между собой благодаря хранению адресов.
  • Графы - множество вершин (узлов), соединённых рёбрами.
  • Деревья - иерархически связанные элементы данных, частный случай графа.
  • Хэш-таблицы (ассоциативные массивы) - наборы ‘’ключ-значение’‘.
Определение структуры¶

Сначала мы описываем новый структурный тип:

Потом создаём объекты:

Инициализация¶ Свойства структур¶
  • В памяти все поля структуры располагаются последовательно.
  • Память под структуру выделяется при объявлении переменных.
  • Доступ к полям производится с помощью операций . и ->.
  • Полем структуры может быть указатель на структуру.
Доступ к значениям полей¶

Для доступа к полю через структурный объект используется ‘’точка’‘

Для доступа к полю через адрес объекта используется ‘’стрелочка’‘

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

Структуры можно вкладывать друг в друга (‘’матрёшки’‘)

Присвоение структур¶

Допускается присваивать структурные объекты как обычные переменные при соблюдении следующих условий:

  1. Объекты одного типа
  2. В объекте нет полей-указателей

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

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

Структуры и функции¶

Структуры можно передавать в функцию как по значению, так и по указателю.

В отличии от массивов, структуры можно возвращать из функций:

Структуры и указатели¶

Структура может содержать указатель на себя в качестве поля:

Благодаря полю next можно связывать структурные объекты между собой (создавать связанные списки).

Объединения¶

Объединения описываются практически так же, как и структуры, но вместо struct используется union.

В отличие от структур, размер объединения определяется размером его самого длинного поля.

Структуры и объединения¶

Рассмотрим почти одинаковые описания. В чем разница между ними?

Объект типа А будет занимать в два раза больше памяти, поскольку нужно одновременно хранить значение массива и целой величины.

Объект типа В будет хранить в одной области памяти либо массив байт, либо целое значение.

Размер памяти, выделяемый под объединение равен размеру самого большого поля.

Безымянные объединения¶

Безымянные объединения используются для экономии памяти.

Применение объединений¶

Объединения могут использоваться для:

  • Для экономии памяти (особенно во встроенных системах).
  • Для исследования значений отдельных байтов многобайтных величин.
  • Для интерпретации данных, расположенных в некоторой области памяти.
Поля битов¶ Поле битов¶

В С есть возможность организовать память для хранения величин, размером менее 1 байта. Это возможность предоставляется полями битов.

Поле битов -это структура, где для каждого поля указывается ширина в двоичных разрядах.

Поле битов реализуется как набор смежных полей, размещенных внутри типа signed int или unsigned int.

Смещение границ¶

Что происходит, если общее количество бит, превышает размер int?

В этом случае используется следующая ячейка памяти типа int.

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

📎📎📎📎📎📎📎📎📎📎