Структуры в СИ
Структура – это сложный тип данных представляющий собой упорядоченное в памяти множество элементов различного типа. Каждый элемент в структуре имеет свое имя и называется полем. В СИ элементы структуре располагаются последовательно, а размер структуры определяется суммой размеров всех элементов.
Объявление в СИ структуры имеет вид:
struct [имя типа]
{
поле_1;
поле_2;
...
поле_N;
} [список переменных];
Объявление полей структуры возможно только без инициализации. Если несколько полей следующих друг за другом в описании структуры имеют один и тот же тип, то для их описания можно использовать синтаксис объявления нескольких переменных одного и того же типа. Типом поля может быть любой тип (как системный, так и пользовательский), описанный ранее.
Примеры структур:
Пример структуры в СИ, содержащая информацию о точке в двумерном пространстве (координаты):
struct Point
{
double x, y;
};
А вот структура в СИ, содержащая информацию об окружности:
struct Circle
{
double x, y, r;
};
Структура, содержащая информацию о студенте (фамилия, имя, отчество, номер зачетной книжки, средний балл):
struct Student
{
char sname[20], name[20], patronymic[20];
unsigned int num;
double mark;
};
Структура в СИ, содержащая информацию о группе студентов (название группы, количество студентов, список студентов (максимально 30)):
struct Group
{
char name[10];
unsigned number;
struct Student list[30];
};
В языке СИ объявление переменной определенной структуры осуществляется после описания данной структуры вследующем виде:
struct тип имя_1[= значение_1][,...];
struct Point pnt[3] = {{0,0},{1,0},{0,1}};
struct Circle c1 = {10.0,10.0,5.0},
c2 = {0.0,0.0,25.0};
struct Student st
= {"Иванов","Иван","Иванович",959623,7.5};
struct Group gr ={
"97-BC”, 3, {
{"Иванов”, ”Иван”, ”Иванович”, 979601,8.0},
{"Петров”, ”Петр”, ”Петрович”, 979602,6.5},
{"Сидоров”,”Сидор”,”Сидорович”,979603,9.0}
}
};
От обязательно использования ключевого слова struct можно отказаться, если описывать структуру, используя оператор объявления типа typedef в следующем виде:
typedef struct [первичное имя типа] {...} имя типа;
Первичное имя типа, указываемое перед перечнем полей структуры является необязательным и указывается редко. Как правило, первичное имя типа имеет тот же идентификатор, что и основное имя типа, но начинается со знака подчеркивания. Структура, содержащая информацию о книге (ФИО автора, название книги, год издания):
typedef struct {
char author[20], title[50];
unsigned year;
} BOOK;
Объявление переменной данного типа:
BOOK book = {"Автор1”,”Книга1”, 1986};
Обращение к полям структуры осуществляется в следующем виде:
имя_переменной.имя_поля
Для обращения к конкретному полю структуры сначала пишется имя переменной структуры, а после через точку название поля. С точки зрения языка СИ при таком обращении к полю можно как получить его значение так и присвоить ему новое.Примеры:
Вычисление длины окружности, заданной переменной cir типа Circle:
double length = 2.0*3.1415*cir.r;
Ввод информации о студенте в переменную st типа Student:
scanf("%s %s %s %u %lf", &st.sname, &st.name,
&st.patronymic, &st.num, &st.mark);
Вывод на экран списка группы, заданной в переменой gr типа Group:
printf("Группа: %s\n",gr.name);
for(unsigned i=0;i < n; ++i)
printf("%2u: %20s %20s %20s %6u %.1lf\n", i+1, gr.list[i].sname, gr.list[i].name, gr.list[i].patronymic, gr.list[i].num, gr.list[i].rate);
Для определения размера переменной структурного типа в байтах используется оператор определения типа sizeof.
Например:
unsigned size = sizeof(struct Student); //size == 57
Далее переходим к работе с файлами в СИ.