Структуры в Си
Введение
Структура - это объект в котором может быть несколько других объектов причём
разных типов.
Рассмотрим такой объект как веб сайт.
Назовём структуру Website
У сайта может быть адрес или имя | Website name |
Год создания | Website year |
Администратор | Website admin |
Рейтинг или индекс качества | Website rating |
И огромное количество других объектов |
Сайтов могут быть тысячи и всю эту информацию нужно как-то хранить.
Можно создать массив, но какого типа? url скорее всего char, year int, admin char, rating double
Делать несколько массивов очень накладно.
Чтобы решить эту задачу подойдут структуры. Достаточно объявить тип структуры, напримр Website,
перечислить какие объекты мы хотим хранить и какие у них типы. Затем можно
создавать новые объекты типа structure объявлять, что они типа Website и обращаться к их вложенным объектам.
Создадим структуру Website и несколько объектов типа Website, проще говоря - сайтов.
Website - это называние структуры, что-то вроде типа. Аналог это int, char, float. Только этот тип Вы
создаёте сами.
У каждого будет имя, год и рейтинг.
После того как они созданы, обращаться к объектам можно дописав их имя к названию структуры черзе точку.
Например: Название_объекта.name
#include <stdio.h>
#include <string.h>
struct Website {
char name[80];
int year;
float rating;
}
// пока что никаких объектов не создано - мы просто определили структуру с именем Website.
// эта структура содержит три члена (поля) разного типа.
site0, site1 = {"AndreyOlegovich.ru", 2010, 310.1}
// 1. Только теперь, когда мы объявили две переменные site0 и site1 типа Website
// у нас появились объекты данной структуры
// члены site1 инициализированы а вот
// site0 пока что "пуст"
;
int main()
{
printf("site1 -- Name: %s year: %d rating: %.1f\n", site1.name, site1.year, site1.rating);
// 2. Cтандартный способ присвоить значения объектам структуры
struct Website site2 = {"HeiHei.ru", 2018, 30.0};
printf("site2 -- Name: %s year: %d rating: %.1f\n", site2.name, site2.year, site2.rating);
// 3. Присвоим значения объектам по отдельности
struct Website site3;
// С int и float всё просто
site3.year = 2010;
site3.rating = 310.1;
// А вот с char нужно поработать дополнительно
strcpy(site3.name, "TopBicycle.ru");
printf("site3 -- Name: %s year: %d rating: %.1f\n", site3.name, site3.year, site3.rating);
// 4. Заполним структуру с клавиатуры с помощью функции scanf();
struct Website site4;
printf("Enter the name, year and rating for site4\n");
scanf("%s %d %f", site4.name, &site4.year, &site4.rating);
printf("site4 -- Name: %s year: %d rating: %.1f\n", site4.name, site4.year, site4.rating);
// 5. Копируем структуру
site0 = site4;
printf("site0 -- Name: %s year: %d rating: %.1f\n", site0.name, site0.year, site0.rating);
return 0;
}
О функции scanf() Вы можете прочитать здесь
gcc -o struc struct.c
./struct
site1 -- Name: AndreyOlegovich.ru year: 2010 rating: 310.1 site2 -- Name: HeiHei.ru year: 2018 rating: 30.0 site3 -- Name: TopBicycle.ru year: 2010 rating: 310.1 Enter the name, year and rating for site4 aredel.com 2018 10 site4 -- Name: aredel.com year: 2018 rating: 10.0 site0 -- Name: aredel.com year: 2018 rating: 10.0
Следующий урок: Оператор «стрелка» указатель на член структуры Предыдущий урок: Указатели