Структуры как элементы структур

Последнее обновление: 07.01.2023

Кроме базовых примитивных типов данных как 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}};

Опять же передача значений идет в том порядке, в котором элементы определены в структуре, в том числе во вложенных структурах.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850