НРТК
Структуры
Операции со структурами
Члены структур
Указатели/массивы и структуры
Члены структур
Члены структур
Члены структур
Размеры структур
Размеры структур
Пример
Структуры и объединения в C
Битовые поля
Пример
Структуры и функции
Вариант 1 — по значению
Вариант 1 — по значению
Вариант 2 — по указателю (C)
Вариант 3 — по ссылке (C++)
Плюсы и минусы
Задачи
134.66K
Category: programmingprogramming

Структуры. С / С++. Тема 9

1. НРТК

С / С++
Тема 09. Структуры
НРТК, 2022 г. 1
Структуры
Созонов А.А.

2.

Структуры в C++
НРТК, 2022 г. 2
Структуры
Созонов А.А.

3. Структуры

• Структура — это набор элементов
различных типов (ср. массив)
• Синтаксис объявления структуры:
struct [<имя_типа>] { <описание_членов> }
[<список_переменных>];
• Пример:
struct
{
char
int
} Sam,
НРТК, 2022 г. 3
Friend
name[20];
age;
July;
Структуры
Созонов А.А.

4. Операции со структурами

• Инициализация при объявлении
переменной:
Friend John = { "Иван", 23 };
• Присваивание:
Friend Mike = John;
• Другие операторы (например: ==, !=, …) не
определены
Friend dude1, dude2;
...
if(strcmp(dude1.name, dude2.name) == 0 &&
dude1.age == dude2.age)
...
НРТК, 2022 г. 4
Структуры
Созонов А.А.

5. Члены структур

• Элемент структуры называется членом
структуры
• Обращение к членам структуры через
переменную:
<имя_переменной>.<член_структуры>
• Пример:
Friend Mike, Helen, Bob;
strcpy(Mike.name, "Миша");
Mike.age = 17;
Helen.age = 18;
Bob.age = Mike.age + Lena.age;
НРТК, 2022 г. 5
Структуры
Созонов А.А.

6. Указатели/массивы и структуры

• Обращение к членам структуры через
указатель:
<имя_указателя>-><член_структуры>
• Пример:
Friend* Mike = new Friend;
(*Mike).age = 18;
strcpy(Mike->name, "Миша");
• Массив структур:
Friend friends[100];
// или:
Friend* friends = new Friend[100];
friends[3].age = 17;
// или:
(friends + 3)->age = 17;
НРТК, 2022 г. 6
Структуры
Созонов А.А.

7. Члены структур

• Элементы «простых» типов
• Массивы
– «простых» элементов
– массивов
– структур
• Другие (вложенные) структуры
• ...
phonebook.records.pages[i].item[0].name
НРТК, 2022 г. 7
Структуры
Созонов А.А.

8.

Пример: Outlook
struct Date
struct Address
{ int year, month, day; };
{ char* town, *street, *comment;
int house, apart; };
struct Phone
{ char* code, *num, *comment; };
struct Business { char* organization, *position;
Address address;
Phone phones[4]; };
struct Person
{
char*
name;
Date
birthday;
Address address[3];
Phone
phone[4];
Business business;
};
НРТК, 2022 г. 8
Структуры
Созонов А.А.

9. Члены структур

• Структура не может быть членом самой
себя:
struct BadStruct
{
BadStruct bad_member; // Ошибка компиляции
};
• Но указатель на структуру — может:
struct Friend
{
char name[20];
int age;
Friend* best_friend;
};
НРТК, 2022 г. 9
Структуры
Созонов А.А.

10. Члены структур

• Что если две структуры должны указывать
друг на друга?
• Опережающее описание:
struct S2;
// Без этой строчки нельзя
// создавать указатели на S2
struct S1
{
S2* link;
};
struct S2
{
S1* link;
};
НРТК, 2022 г. 10
Структуры
Созонов А.А.

11. Размеры структур

• Размер структуры — сумма размеров ее
членов плюс выбираемое компилятором
выравнивание
struct Struct1
{
int i1; char s1[6];
int i2; char s2[6];
};
struct Struct2
{
char s1[6]; char s2[6];
int i1;
int i2;
};
int len1 = sizeof(Struct1);
int len2 = sizeof(Struct2);
НРТК, 2022 г. 11
Структуры
// len1 = 24;
// len2 = 20;
Созонов А.А.

12. Размеры структур

• Выравнивание нужно для более быстрого
доступа к членам структуры
• Часто выравнивание — по границе
машинного слова
• Сортировка членов структур по размеру
минимизирует неиспользуемое
пространство
Struct1
i1
s1
i2
s1
100 102 104 106 108 110 112 114 116 118 120 122 124
Struct2
s1
НРТК, 2022 г. 12
Структуры
s2
i1
i2
Созонов А.А.

13.

Объединения
НРТК, 2022 г. 13
Структуры
Созонов А.А.

14.

Объединения
Объединение — это структура в которой все
члены расположены по одному и тому же адресу
Синтаксис объявления объединения:
union [<имя_типа>] { <описание_членов> }
[<список_переменных>];
Пример:
union PhoneNumber
{
long number;
char coded[8];
} phone1, phone2;
НРТК, 2022 г. 14
Структуры
coded
number
100 102 104 106 108 110
Созонов А.А.

15. Пример

union Rectangle
{
struct { int left, top, right, bottom;
};
struct { int x_centr, y_centr, width, height; };
} r;
r.Left = 4; // r.x_centr == 4
left
x_centr
top
y_centr
right
width
bottom
height
struct Rectangle
100 102 104 106 108 110 112 114 116 118
{
int left, top;
union { int right, width; };
union { int bottom, height; };
};
right
bottom
left
top
width
height
100 102 104 106 108 110 112 114 116 118
НРТК, 2022 г. 15
Структуры
Созонов А.А.

16. Структуры и объединения в C

• В C имена структур и объединений не
являются типами, если не указывать struct
(union)
struct S { int dummy; };
S s;
// Ошибка, идентификатор не найден
struct S s; // Верно
• Обычно:
typedef struct S { int dummy; } S;
S s;
// Верно
• Есть и другие различия
НРТК, 2022 г. 16
Структуры
Созонов А.А.

17.

Битовые поля
НРТК, 2022 г. 17
Структуры
Созонов А.А.

18. Битовые поля

• Битовые поля — способ указать количество
бит, необходимых для хранения члена
структуры или объединения
• Объявление битовых полей
{struct|union} [<имя_типа>] {
<тип> [<имя_поля>] : <количество_бит>; ... }
[<список_переменных>];
• Тип может быть интегральным типом (bool,
signed/unsigned int, short, long) или
перечислением (enum)
НРТК, 2022 г. 18
Структуры
Созонов А.А.

19. Пример

struct Date
{
unsigned int
unsigned int
unsigned int
unsigned int
unsigned int
};
year : 11;
month : 4;
: 1;
day
: 5;
week : 3;
left
НРТК, 2022 г. 19
Структуры
month
day
week
Созонов А.А.

20.

Структуры и функции
НРТК, 2022 г. 20
Структуры
Созонов А.А.

21. Структуры и функции

• Структуры как возвращаемые значения:
Friend CreateFriend(char* name, int age);
• Структуры как параметры функций:
int WhoIsOlder(Friend friend1, Friend friend2)
{
if(friend1.age == friend2.age)
return 0;
else if(friend1.age < friend2.age)
return -1;
else
return 1;
}
НРТК, 2022 г. 21
Структуры
Созонов А.А.

22. Вариант 1 — по значению

int WhoIsOlder(Friend friend1, Friend friend2);
int main()
{
Friend Bob, Mike;
...
int who = WhoIsOlder(Bob, Mike);
}
int WhoIsOlder(Friend friend1, Friend friend2)
{
if(friend1.Age == friend2.Age)
...
}
НРТК, 2022 г. 22
Структуры
Созонов А.А.

23. Вариант 1 — по значению

int WhoIsOlder(Friend friend1, Friend friend2);
int main()
{
Friend Bob, Mike;
...
int who = WhoIsOlder(Bob, Mike);
}
int WhoIsOlder(Friend friend1, Friend friend2)
{
if(friend1.Age == friend2.Age)
...
}
Копирование всей структуры — плохо!
НРТК, 2022 г. 23
Структуры
Созонов А.А.

24. Вариант 2 — по указателю (C)

int WhoIsOlder(Friend* friend1, Friend* friend2);
int main()
{
Friend Bob, Mike;
...
int who = WhoIsOlder(&Bob, &Mike);
}
int WhoIsOlder(Friend* friend1, Friend* friend2)
{
if(friend1->age == friend2->age)
...
}
НРТК, 2022 г. 24
Структуры
Созонов А.А.

25. Вариант 3 — по ссылке (C++)

int WhoIsOlder(Friend& friend1, Friend& friend2);
int main()
{
Friend Bob, Mike;
...
int who = WhoIsOlder(Bob, Mike);
}
int WhoIsOlder(Friend& friend1, Friend& friend2)
{
if(friend1.Age == friend2.Age)
...
}
НРТК, 2022 г. 25
Структуры
Созонов А.А.

26. Плюсы и минусы

• При передаче по ссылке (по указателю) не
копируются большие объемы памяти
• При вызове функции нельзя использовать
константы
• Изменение локальных переменных меняет
глобальные
int WhoIsOlder(Friend& friend1,
Friend& friend2)
{
// Ошибочное присваивание:
if(friend1.age = friend2.age)
...
}
НРТК, 2022 г. 26
Структуры
Созонов А.А.

27.

Вариант 4 — окончательный
int WhoIsOlder(const Friend* friend1,
const Friend& friend2);
int main()
{
Friend Bob, Mike;
...
int who = WhoIsOlder(&Bob, Mike);
}
int WhoIsOlder(const Friend* friend1,
const Friend& friend2)
{
if(friend1->age = friend2.age) // Ошибка компиляции
}
НРТК, 2022 г. 27
Структуры
Созонов А.А.

28. Задачи

• Функции для работы со структурами Date,
Address, Phone, Business и Person
• Задачи для самостоятельной работы
НРТК, 2022 г. 28
Структуры
Созонов А.А.
English     Русский Rules