Хрестоматия по программированию на Си в Unix


Структуры данных. Хрестоматия по программированию на Си в Unix


Структуры данных.

Структуры ("записи") представляют собой агрегаты разнородных данных (полей разного типа); в отличие от массивов, где все элементы имеют один и тот же тип.

struct { int x, y; /* два целых поля */ char s[10]; /* и одно - для строки */ } s1;

Структурный тип может иметь имя:

struct XYS { int x, y; /* два целых поля */ char str[10]; /* и одно - для строки */ };

Здесь мы объявили тип, но не отвели ни одной переменной этого типа (хотя могли бы). Теперь опишем переменную этого типа и указатель на нее:

struct XYS s2, *sptr = &s2;

Доступ к полям структуры производится по имени поля (а не по индексу, как у массивов):
имя_структурной_переменной.имя_поля


указатель_на_структуру -> имя_поля

то есть

не а #define ВЕС 0 struct { int вес, рост; } x; #define РОСТ 1 x.рост = 175; int x[2]; x[РОСТ] = 175;

Например

s1.x = 13; strcpy(s2.str, "Finish"); sptr->y = 27;

Структура может содержать структуры другого типа в качестве полей:

struct XYS_Z { struct XYS xys; int z; } a1; a1.xys.x = 71; a1.z = 12;

Структура того же самого типа не может содержаться в качестве поля - рекурсивные определения запрещены. Зато нередко используются поля - ссылки на структуры такого же типа (или другого). Это позволяет организовывать списки структур:

struct node { int value; struct node *next; };

Очень часто используются массивы структур:

struct XYS array[20]; int i = 5, j; array[i].x = 12; j = array[i].x;

Статические структуры можно описывать с инициализацией, перечисляя значения их полей в {} через запятую:

extern struct node n2; struct node n1 = { 1, &n2 }, n2 = { 2, &n1 }, n3 = { 3, NULL };

В этом примере n2 описано предварительно для того, чтобы &n2 в строке инициализации n1 было определено.

Структуры одинакового типа можно присваивать целиком (что соответствует присваиванию каждого из полей):

struct XYS s1, s2; ... s2 = s1;

в отличие от массивов, которые присваивать целиком нельзя:




- Начало -    - Вперед -



Книжный магазин