[Оглавление] | [<< страница] | [>>страница] |
1.9. Записи и операции над ними
Си
Запись (структура) создается объединением поименованных элементов (полей) произвольных типов. Сами элементы, в свою очередь, могут быть составными. В математике такие составные типы называют декартовым произведением составляющих его типов. Мощность составляющего типа есть произведение мощностей составляющих его типов.
Каждый элемент в записи имеет свое уникальное имя, но такое же имя может использоваться в других записях или для обозначения других объектов программы.
Записи, как и массивы, состоят из фиксированного числа элементов, но между массивами и записями имеются два существенных различия. Вопервых, в отличие от массива, состоящего из однотипных элементов, элементы записи могут быть разных типов. Во-вторых, в то время как доступ к элементам массива осу¬ществляется посредством индексов, доступ к элементам записи — по их именам. Отдельные поля (элементы) записи могут служить в качестве ключей записей.
Записи, как правило, используются в других, более сложных структурах: в таблицах, файлах, базах данных. Отдельная запись используется редко, обычно для извлечения и обработки элементa из более сложной структуры.
Элементы записи «дата рождения» и «дата поступления на работу», в свою очередь, могут рассматриваться также как запись:
Запись хранится в одной сплошной области памяти, причем ее элементы размещаются в памяти последовательно друг за другом в том порядке, в котором они перечислены в записи, например: фамилия, имя, отчество, день, месяц и год рождения, день, месяц и год поступления на работу, специальность, семейное положение.
В языке Си запись получила название структура. Для работы с конкретной
структурой в программе вводится структурный тип:
struct имя_структурного_типа
{ определение элемента 1;
определение элемента 2;
…
определение последнего элемента;
};
Определим структурный тип о служащем. Поскольку два эле¬мента с датами са-ми являются записями, сначала для них опреде¬ляется структурный тип:
struct Date
{ int Den; /* день */
int Mes; /* месяц */
int God; /* год */
};
Этот тип теперь можно использовать для определения струк¬турного типа о слу-жащем:
struct sluz
{ char Fam[20];
char lm[12];
char Otc[15];
struct Date Rozd, Post;
char Spec[15];
char SemPol;
}
При определении структурного типа его элементам память не выделяется,
поэтому их нельзя инициализировать, т. е. структурный тип не является объектом, он
определяет только формат структуры. С использованием описанного структурного типа
можно определить конкретные структуры, т. е. ввести в рассмотрение объекты
структурного типа, например:
struct sluz Ivanov, Petrov, Sidorov;
Здесь Ivanov, Petrov, Sidorov являются переменными структурного типа, для
каждой из них выделяется необходимая для размещения статическая память.
Переменные структурного типа, указатели на них и массивы структур могут быть
определены одновременно с определением структурного типа:
struct sluz
{ char[20] Fam;
char SemPol;
} Ivanov, Petrov, Sidorov, Rab, *T, Sp[5];
При таком определении имя структурного типа sluz может быть опущено (
определяется структурный безымянный тип), однако это делается крайне редко. Как
указывалось выше, записи могут являться элементами более сложных структур, тогда имя
струк¬турного типа используется при определении отдельного элемента. Например, имя
Date применялось при определении элементов Rozd и Post в записи sluz. Имя
структурного типа используется также при создании массива структур:
struct sluz Otd531[36];
Кроме того, ссылка (указатель) на имя структурного типа может
использоваться для создания динамического объекта структурного типа:
struct sluz *Tmp;
Tmp=(struct sluz*) malloc(sizeof(struct sluz));
Переменные структурных типов или указатели на них могут выступать как параметры функций и возвращаемые функциями значения: struct sluz* Poisk(struct sluz Otd[]):
Функция Роisk осуществляет поиск служащего в массиве, заданном параметром Otd[], и возвращает указатель на запись с найденным служащим или NULL в случае неудачи.
Инициализация записи. Похожа на инициализацию массива и
осуществляется при ее определении, например:
Struct sluz Orlov = {"Орлов","Иван","Петрович", {2,8,1980},{ 15,7,1997},
"слесарь", 'х'};
Доступ к элементам записи. Осуществляется с использованием составного имени: имя_структуры.имя_элемента, например: Petrov.SemPol=’ж’; или Petrov.Rozd.God = 1981; Доступ возможен также через указатель: Tmp->Post.God = 1999; или (*Tmp.Post.God) = 1999; Доступ к элементу структуры, являющейся элементом массива структур, осуществляется с использованием индекса элемента массива: Sp[2].Spec= "инженер"; Sp[2].Post.God = 2000;
По стандарту языка Си разрешается присваивание значения структуре:
Petrov = *Tmp; *Tmp=Rab; Rab=Petrov; Sp[l]=Rab;
Сравнение элементов записей. Осуществляется обычным порядком, с учетом типа данных сравниваемых элементов. Сравнение записей в целом в Си не предусмотрено, возможно, только поэлементное сравнение записей.
[Оглавление] | [<<страница] | [>>страница] | [В начало ] |