# 8. Составные типы данных. Назначение, занимаемая память, диапазон значений, допустимые операции

### **Составные типы данных** - типы данных, которые состоят из простых, а именно: структура и объединение.

## Структура <a href="#struktura" id="struktura"></a>

Это объединение элементов под одним названием. Занимает место равное сумме размеров всех входящих в нее элементов. Переменная структуры хранит в себе все значения для каждого из элементов.

## **Допустимые операции:**

* Операция членства <имя структуры>.<член структуры>
* Операция косвенного членства <указатель на структуру> -> <член структуры>
* Операция взятия адреса &
* Операция sizeof
* Операция присваивания =

## **Работа со структурами:**

* Объявление структуры (шаблона)

```cpp
struct book {
    char title [41];
    char author [31];
    float value;
};
```

* Определение переменной типа структуры

```cpp
struct book library;
//или
struct book {
    char title [41];
    char author [31];
    float value;
} library; //объявление с именем переменной
```

* Инициализация структуры

```cpp
struct book library = {
    "The Pinokio",
    "Some Author",
    1.95
};
//или отдельно
struct book surprise = {.value = 10.99};
```

* Объявление массива структур

`struct book library[10];`

Здесь library объявляется как массив, содержащий 10 элементов. Каждый элемент этого массива является структурой типа book. Таким образом, library\[0] - одна структур типа book, library\[1] - вторая структура типа book и т.д.&#x20;

* Указатель на структуру

`struct book * shell;` - объявление указателя на структуру

`shell = &library;` - определение указателя

`library.title == (*shell).title == shell->title`

`struct book * shell;` - объявление указателя на структуру`shell = &library;` - определение указателя`library.title == (*shell).title == shell->title`

## Выравнивание полей структур <a href="#vyravnivanie-polei-struktur" id="vyravnivanie-polei-struktur"></a>

Нужно для оптимизации доступа к памяти. Заполнять структуру нужно всегда от больших данных к меньшим, так как объем занимаемой памяти всегда кратен большему.Без выравнивания останутся пустые ячейки:​![](https://3074527236-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOlTieA4l7aQXw27w94AS%2Fuploads%2Fqier0RZTZf7l5QTyZcNk%2Fimage.png?alt=media\&token=a5ef6465-86e1-410b-92aa-7113c0a8cc4a)​

## Объединение <a href="#obedinenie" id="obedinenie"></a>

Это тип, позволяющий хранить данные разных типов в одном и том же месте памяти (но не одновременно). Объединение занимает память, равную наибольшему из ее элементов. Переменная объединения может хранить в себе значение только одного из элементов, поэтому изменяя значение одного из элементов, предыдущее значение удаляется. &#x20;

Допустимы те же операции, что и со структурами

​

<figure><img src="https://3074527236-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOlTieA4l7aQXw27w94AS%2Fuploads%2FBYL9cqurEE9tn237QVBj%2Fimage.png?alt=media&#x26;token=9d9656cd-8979-40cd-a3e7-448bf3f93fa4" alt=""><figcaption></figcaption></figure>
