Структуры как элементы структур
Кроме базовых примитивных типов данных как int или char, массивов и указателей в качестве элементов структуры можно использовать другие структуры. Рассмотрим на примере.
Определим следующую программу:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
struct company
{
char name[20];
char country[30];
};
struct smartphone
{
char title[20];
int price;
struct company manufacturer;
};
int main(void)
{
struct smartphone phone = {"iPhone 8", 56000, "Apple", "USA"};
printf("\n Phone: %s", phone.title);
printf("\n Price: %d", phone.price);
printf("\n Manufacturer: %s", phone.manufacturer.name);
return 0;
}
Использованные здесь структуры отражают объекты реального мира. Структура company представляет некоторую компанию, ее элементы name и country представляют название и страну компании соответственно. А структура smartphone представляет смартфон, в котором определено три элемента: title - название, price - цена и manufacturer - компания-производитель. Последний элемент в свою очередь представляет структуру company.
Таким образом, получается, что структура phone имеет три элемента, но так как последний элемент составной и сам содержит два элемента, то при инициализации структуры smartphone нам надо ей передать 4 значения:
1
struct smartphone phone = {"iPhone 8", 56000, "Apple", "USA"};
Что можно формализовать следующим образом:
1
struct smartphone phone = {title, price, manufacturer.name, manufacturer.country};
Опять же передача значений идет в том порядке, в котором элементы определены в структуре, в том числе во вложенных структурах.
И чтобы обратиться к полям вложенной структуры, надо сначала обратиться к самой этой структуре:
1
phone.manufacturer.name
И подобное обращение будет применяться при всех операциях с элементами вложенной структуры company. Например, рассмотрим ввод данных с консоли:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
struct company
{
char name[20];
char country[30];
};
struct smartphone
{
char title[20];
int price;
struct company manufacturer;
};
int main(void)
{
struct smartphone phone;// = {"iPhone 8", 56000, "Apple", "USA"};
printf("Enter phone title: ");
scanf("%20s", &phone.title);
printf("Enter price: ");
scanf("%d", &phone.price);
printf("Enter manufacturer: ");
scanf("%s", &phone.manufacturer.name);
printf("Enter country: ");
scanf("%s", &phone.manufacturer.country);
printf("\nPhone: %s \n", phone.title);
printf("Price: %d \n", phone.price);
printf("Manufacturer: %s \n", phone.manufacturer.name);
return 0;
}
Для ввода значения, например, имени компании-производителя смартфона, используется получение адреса соответствующего элемента &phone.manufacturer.name.
Результат работы программы:
Enter phone title: iPhone
Enter price: 56000
Enter manufacturer: Apple
Enter country: USA
Phone: iPhone
Price: 56000
Manufacturer: Apple