Структурен тип

Структурен тип. Този тип (изведено агрегиране) дефинира вътрешната структура на дефинираните с него структури. Казаното изисква обяснение. Нека започнем с понятието структура.Структура -е набор от именувани елементи от данни (компоненти), комбинирани в едно цяло. За разлика от масива, който винаги се състои от елементи от един и същи тип, компонентите на структурата могат да бъдат от различни типове и всички трябва да имат различни имена. Например може да се въведе структура, която описва стоките в склад с компоненти:

• име на продукта (char *);

• цена на едро (покупна) (long );

• търговски марж в проценти (float );

• обем на пратката (int );

• дата на получаване на пратката(char [9]).

При изброяването на елементите на структурата "стоки в наличност" се добавят избраните от програмиста типове на тези елементи. В съответствие със значението компонентите могат да имат всеки от разрешените в езика типове данни. Тъй като в един склад може да има много стоки, за да дефинира отделни структури, съдържащи информация за конкретни стоки, програмистът въвежда производен тип, нареченструктурен.За нашия пример той може да бъде въведен например по следния начин:

Тукstruct е спецификатор на структурен тип (функционална дума); стоки - името (името) на структурния тип, предложен от програмиста. (Използвайки транслитерацията на английския термин "tag", наименованието на структурен тип в българоезичната литература на език C доста често се нарича етикет.) Описанията на елементите, които ще бъдат включени във всеки обект от типа стока, са поставени във фигурни скоби. И така, форматът за дефиниране на тип структура е както следва:

структураиме_структурен_тип

къдетоstruct е спецификатор на структурен тип;

structural_type_name -идентификатор, произволно избран от програмиста;

element_definitions -колекция от една или повече декларации на обекти, всяка от които служи като прототип за структурни елементи от типа входна структура.

Обърнете внимание, че дефиниция на тип структура (за разлика от дефиниция на функция) завършва с точка и запетая.

Конструкциятаstructstructural_type_nameиграе същата роля като спецификатори на тип, катоdouble илиint. Сstruct goods можете или да дефинирате конкретна структура (като обект от типа structstruct goods) или указател към структури от този тип. Пример:

В допълнение към такава директна дефиниция на наименуван структурен тип може да се въведе неназован структурен тип и непълно дефиниран (непълен) структурен тип. Типът структура без име ще бъде обсъден по-късно в този раздел, когато структурите се дефинират като обекти. Не е напълно дефиниран, т.е. тип незавършена структура, ще са необходими в следващия раздел, когато разглеждаме указатели към структури, въведени като членове на структури. Между другото, отбелязваме, че не само структурният тип може да бъде непълен. В общ смисъл всяка дефиниция, която не съдържа достатъчно информация за размера на бъдещия обект, се счита за непълна.

Друга възможност за въвеждане на структурен тип е служебната думаtypedef,, която ви позволява да въведете собствено обозначение за всяка дефиниция на тип. В случай на тип структура, той може да бъде въведен и наименуван, както следва:

typedef структура

Горната дефиниция въвежда типа структураstruct doublereal;двойно изображение;> и му присвоява обозначението(име, име) комплекс. Структури (обекти) могат да бъдат въведени с тази нотация по същия начин, както с име на нормален структурен тип (напримерstruct goods в предишния пример). Пример:

Тип структура, на който програмист присвоява име сtypedef,, може в същото време да има второ име, въведено по стандартния начин след функционалната думаstruct. Като пример, нека въведем дефиницията на тип структура "рационална дроб". Ще приемем, че рационална дроб е двойка цели числа (m; n), където числото n е различно от нула. Дефиницията на такава фракция е:

.

Тук fraction е нотация за структурен тип, въведена отtypedef. Името rational_fraction се въвежда за същия структурен тип по стандартния начин. След такава дефиниция структури от тип "рационална дроб" могат да бъдат въведени или с името fraction, или с нотация от същия типstruct rational_fraction.

С директивата#define имената на типове могат да се въвеждат по същия начин, както сtypedef. Например, информация за книга може да се въвежда по следния начин:

Тук BOOK е идентификатор на предпроцесора, последван от "заместващ низ" на няколко реда. Обърнете внимание на използването на знака за продължение '\' за обвиване на константата на низа. Също така обърнете внимание на липсата на точка и запетая след затварящата скоба '>'. По-нататък в програмата можете да дефинирате специфични структурни обекти или указатели, като използвате името BOOK, въведено на ниво препроцесор:

(Вижте дефиницията на структури и дефиницията на указатели към структури по-долу.)