# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://op-al.gitbook.io/s-30-voprosy-i-dop.-voprosy/8.-sostavnye-tipy-dannykh.-naznachenie-zanimaemaya-pamyat-diapazon-znachenii-dopustimye-operacii.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
