C/C++ · 6 min read · Oct 10, 2025

Изучение C/C++ шаг за шагом - Страница 10

10. Шаг за Шагом C/C++ — Программирование на C - Структура

Структуры

| | 1. Введение

  1. Объявление структуры
  2. Определение переменной структуры
  3. Инициализация переменной структуры
  4. Прямое присваивание структур
  5. Вычисление размера структуры
  6. Вложенные структуры
  7. Массив структур
  8. Массивы внутри структур
  9. Передача структур в функцию
  10. Возврат структур из функций
  11. Указатель на структуру
  12. Структура, содержащая указатели
  13. Самоссылающиеся структуры |

1. Введение

| | int a[4] = { 3, 4, 5, 6 };                / Верное выражение /
int a[4] = { 3, 4.23, 5, 6 };                / Неверное выражение /
int a[4] = { 3, “Siglov”, 5,3}                / Неверное выражение / |

Почему последние два выражения неверны? Массив может хранить значения одного типа. Должен быть один и тот же тип. В то время как структура может содержать более одного типа данных в соответствии с ее определением.

| | • Группа из одной или нескольких переменных разных типов данных, организованных под одним именем, называется структурой или
• Коллекция гетерогенных (несхожих) типов данных, сгруппированных под одним именем, называется структурой или
• Структура — это коллекция простых переменных. Переменная в структуре может быть разных типов. Элементы данных в структуре называются членами структур. |

2. Объявление структуры

Когда структура определена, вся группа ссылается через имя структуры. Индивидуальные компоненты, присутствующие в структуре, называются членами структуры, и к ним можно обращаться и обрабатывать отдельно.

| | |

Пример:

| | struct date
{
int day;
int month;
int year;
}; | struct student
{
int sno;
char name[20];
int marks;
float avg;
}; |

3. Определение переменной структуры

Определение переменной структуры такое же, как и для определения встроенного типа данных, такого как int.

| | int a;                             /  верно /
date d;                          / верно (Но только в C++) /
struct date d;                 / верно и в C, и в C++  / |

4. Инициализация переменной структуры

Члены структуры могут быть инициализированы, как и другие переменные. Это можно сделать во время объявления или во время проектирования.

| 1. Инициализация при объявлении:
struct ddate
{
int day;
int month;
int year;
} d = { 27, 10, 2000 }; | 2. Инициализация при определении:
struct ddate d = { 27, 10, 2000 }; | | 1.
Инициализация во время проектирования: ddate d;
d.day = 27;
d.month = 10;
d.year = 2000;
| 4. Инициализация во время выполнения:
scanf(“%d%d%d”, &d.day, &d.month, &d.year); |

Пример:

| | / Напишите программу для ввода и вывода данных сотрудника /
/ 73_struct.c /
#include
struct emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct emp e;

printf(“Введите номер сотрудника    :”); scanf(“%d”, &e.eno);
printf(“Введите имя сотрудника       :”); scanf(“%s”, e.name);
printf(“Введите зарплату сотрудника      :”); scanf(“%d”, &e.sal);
printf(“\n\nДанные сотрудника следующие…. “);
printf(“%d    %s      %d”, e.eno, e.name, e.sal);
return 0;
} |

5. Прямое присваивание структур

Прямое присваивание более одной переменной становится возможным с помощью структур.

| | struct emp a, b = {1001, “Vimal”, 6700.00 };
a = b; / Верно /
printf(“%d %s %d” , a.eno, a.name, a.sal ); | | | Вывод:
1001 Vimal 6700.00 |

6. Вычисление размера структуры

Каждый тип данных в C/C++ имеет заданный размер, т.е. int имеет 2 байта, float имеет 4 байта и так далее. Вот как найти размер переменной структуры.

sizeof:- Эта функция используется для определения размера данной переменной.

| | printf(“%d”, sizeof(int));                           //
printf(“%d”, sizeof(float));                       //
printf(“%d”, sizeof(struct emp));              / Отображает размер структуры emp / |

7. Вложенные структуры

Структура внутри структур называется вложенной структурой. Для доступа к членам вложенной структуры мы должны применить оператор точки дважды при вызове членов структуры.

Пример:

| | / программа для демонстрации вложенной структуры с структурой сотрудника /
/ 74_nested.c /
#include
struct emp
{
int eno;
char name[10];
float sal;
struct                                                    / Вложенная структура  /
{
street char[10];
city char[10];
} addr;
};
int main()
{
struct emp e;
printf(“Введите emp_no, emp_name, emp_sal, street, city “);
scanf(“%d%s%d%s%s”, &e.eno, e.name, &e.sal, e.addr.street, e.addr.city );
printf(“\n\nДанные сотрудника следующие   …. “);
printf(“%d%s%d%s%s”, e.eno, e.name, e.sal, e.addr.street, e.addr.city );
return 0;
} |

8. Массив структур

Мы можем создать массив структур. Массив будет иметь отдельные структуры в качестве своих элементов.

| | / Напишите программу для ввода и вывода данных сотрудника /
/ 75_array.c  /
#include
struct emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct emp e [10];
int i;
for(i = 0; i<10; i++)
{
printf(“Введите номер сотрудника    :”); scanf(“%d”, &e [i].eno);
printf(“Введите имя сотрудника       :”); scanf(“%s”, e [i].name);
printf(“Введите зарплату сотрудника     :”); scanf(“%d”, &e [i].sal);
}
printf(“\n\nДанные сотрудника следующие…. “);
for(i = 0; i<10; i++)
printf(“%d    %s      %d”, e [i].eno, e [i].name, e [i].sal);
return 0;
} |

Ничего нового в вышеуказанной программе. Вся программа такая же, как простая структурированная программа, за исключением отмеченных данных.

9. Массивы внутри структур

Может возникнуть ситуация, когда необходимо использовать массивы внутри структур. Как достичь массивов внутри структур. Вот подход с простой программой.

| | / Программа для ввода и вывода информации о студенте  /
/ 76_array.c /
#include
struct stud
{
int sno;
char name[10];
int marks[5];                              / Массив внутри структуры /
};
int main()
{
struct stud s;
int i;
printf(“Введите номер студента  “); scanf(“%d”, &s.sno);
printf(“Введите имя студента          “); scanf(“%d”, s.name);
for( i = 0; i<3; i++)
{
printf(“Введите оценки студента  “); scanf(“%d”, &s.marks[i]);
}
printf(“\n\nЗаписи студента следующие…. “);
printf(“%d  %s  %d  %d  %d”, s.sno, s.name, s.marks[0], s.marks[1], s.marks[2] );
return 0;
} |

10. Передача структур в функции

Возможно передавать целые структуры в функции в качестве аргументов в вызове функции. Переменная структуры рассматривается как любая обычная переменная.

| | / Программа для передачи переменной структуры в функцию /
/ 77_funct.c /
#include
struct emp
{
int eno;
char name[10];
float sal;
};
void display(struct emp temp);
int main()
{
struct emp e;
display(e);
return 0;
}
void display(struct emp temp)
{
printf(“%d  %s  %d”, temp.eno, temp.name, temp.sal );
} |

11. Возврат структур из функций

Мы можем возвращать структуры из функций. Да, структуры могут возвращаться из функций так же, как и переменные любого другого типа.

| | / Возврат объекта структуры из функции /
/ 78_funct.c /
struct emprec
{
int eno;
char name[10];
};
struct emprec read();
void write(struct emprec t);
int main()
{
struct emprec e;
e = read();
write(e);
return 0;
}
void write(struct emprec t)
{
printf(“\n\n%d  %s”, t.eno, t.name);
}
struct emprec read()
{
struct emprec t;
printf(“Введите номер сотрудника   :”); scanf(“%d”, &t.eno);
printf(“Введите имя сотрудника         :”); scanf(“%s”, t.name);
return t;
} |

12. Указатель на структуру

До сих пор мы видели, что члены структуры могут быть типов данных, таких как int, char, float или даже структура. Язык C/C++ также позволяет объявлять переменную указателя как член структуры. Переменные указателей могут использоваться для хранения адреса переменной структуры. Указатель может быть объявлен так, как будто он указывает на тип данных структуры.

| | / Программа для демонстрации процесса указателя на структуру /
/ 79_pointer.c /
#include
struct employee
{
int eno;
char name[10];
};
struct employee emp;
int main()
{
emp = (struct employee
)malloc(sizeof(emp));
printf(“Введите данные сотрудника ..”);
scanf(“%d%s%”, &emp->eno, emp->name);
printf(“\n\n%d   %s”, emp->eno, emp->name);
return 0;
} |

Отмеченные данные необходимы для реализации указателя на структуру.
Следующее утверждение является необязательным, но лучше использовать его для организации лучшего управления памятью.
emp = (struct employee * )malloc(sizeof(emp));

13. Структуры, содержащие указатели

Переменная указателя также может использоваться как член структуры.
Следующая программа содержит члены указателя, содержащиеся в переменной указателя структуры.

| | / программа для демонстрации использования структур, содержащих указатели /
/ 80_pointers.c  /
#include
struct
{
int a;
int
b;
} *temp;
int main()
{
int x, y;
x = 20; y = 50;
rk -> a = &x;
rk -> b = &y;

printf(“%d %d “, temp->a, temp->b );
return 0;
} | | | вывод:
20    50 |

14. Самоссылающиеся структуры

Структуры могут иметь члены, которые являются типом той же структуры, в которой они включены. Это возможно с помощью указателей, и явление называется самоссылающимися структурами.

| | struct emp
{
int eno;
char name[10];
struct emp *e;
}; |

Самоссылающиеся структуры могут использоваться в основном для упорядочивания данных, сортировки, поиска элементов, вставки, удаления элементов и так далее.

Этот подход приводит к структурам данных (т.е. связанные списки, стеки, очереди, деревья и графы).

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.