Кроме базовых примитивных типов данных как int или char, массивов и указателей в качестве элементов структуры можно использовать другие структуры. Рассмотрим на примере.
Определим следующую программу:
#include <stdio.h> struct company { char* name; char* country; }; struct phone { char* title; int price; struct company manufacturer; }; int main(void) { struct phone realmeC31; realmeC31.title = "Realme C31"; realmeC31.price = 7900; // устанавливаем значения для вложенной структуры realmeC31.manufacturer.name = "Realme"; realmeC31.manufacturer.country = "China"; printf("Phone: %s \n", realmeC31.title); printf("Price: %d \n", realmeC31.price); printf("Manufacturer: %s \n", realmeC31.manufacturer.name); return 0; }
Использованные здесь структуры отражают объекты реального мира. Структура company представляет некоторую компанию, ее элементы
name
и country
представляют название и страну компании соответственно.
А структура phone представляет смартфон, в котором определено три элемента: title - название, price - цена и manufacturer - компания-производитель.
Последний элемент в свою очередь представляет структуру company. И чтобы обратиться к полям вложенной структуры, надо сначала обратиться к самой этой структуре:
realmeC31.manufacturer.name
И подобное обращение будет применяться при всех операциях с элементами вложенной структуры company. Например, рассмотрим ввод данных с консоли:
#include <stdio.h> struct company { char name[20]; char country[20]; }; struct phone { char title[20]; int price; struct company manufacturer; }; int main(void) { struct phone myphone; printf("Enter title: "); scanf("%20[^\n]", myphone.title); printf("Enter price: "); scanf("%d", &myphone.price); printf("Enter manufacturer: "); scanf("%20s", myphone.manufacturer.name); printf("Enter country: "); scanf("%20s", myphone.manufacturer.country); printf("\nPhone: %s \n", myphone.title); printf("Price: %d \n", myphone.price); printf("Manufacturer: %s (%s) \n", myphone.manufacturer.name, myphone.manufacturer.country); return 0; }
Для ввода значения, например, имени компании-производителя смартфона, адрес соответствующего элемента myphone.manufacturer.name
.
Результат работы программы:
Enter title: Realme C30 Enter price: 7900 Enter manufacturer: Realme Enter country: China Phone: Realme C30 Price: 7900 Manufacturer: Realme (China)
При инициализации структуры сразу можно инициализировать и вложенную структуру:
#include <stdio.h> struct company { char* name; char* country; }; struct phone { char* title; int price; struct company manufacturer; }; int main(void) { struct phone realmeC31= {"Realme C31", 7900, {"Realme", "China"}}; printf("Phone: %s \n", realmeC31.title); printf("Price: %d \n", realmeC31.price); printf("Manufacturer: %s \n", realmeC31.manufacturer.name); return 0; }
Поскольку структура realmeC31 имеет три элемента, и последний элемент составной и сам содержит два элемента, то при инициализации структуры phone нам надо ей передать 4 значения:
struct phone realmeC31 = {"Realme C31", 7900, {"Realme", "China"}};
Значения вложенной структуры заключаются во внутреннюю пару фигурных скобок. Что можно формализовать следующим образом:
struct phone realmeC31 = {title, price, {manufacturer.name, manufacturer.country}};
Опять же передача значений идет в том порядке, в котором элементы определены в структуре, в том числе во вложенных структурах.