Определение структур.Определения элементов (компонентов) структурного типа внешне подобны определениям данных соответствующих типов. Однако имеется существенное отличие. При определении структурного типа его компонентам не выделяется память, и их нельзя инициализировать. Другими словами, структурный тип не является объектом.
Из нашего примера определения структурного типа с названием goods следует, что наименование товара будет связано с указателем типа char*,имеющим имя name. Оптовая цена единицы товара будет значением элемента типа longс названием price. Торговая наценка будет значением элемента типа floatс именем percent и т.д. Все это следует из приведенного определения структурного типа с названием goods. Но прежде чем элементы, введенные в определении структурного типа, смогут получить значения, должна быть определена хотя бы одна структура (т.е. структурированный объект) этого типа. Например, следующее определение вводит две структуры, т.е. два объекта, типа goods:
Итак, если структурный тип определен и известно его имя, то формат определения конкретных структур (объектов структурного типа) имеет вид:
structимя_структурного_типа список_структур;
где список_структур - список выбранных пользователем имен (идентификаторов).
Выше показано, что для структурного типа, имя которого введено с помощью служебного слова typedef,определение структур не должно содержать спецификатора типа struct.Например, указатель на структуры для представления комплексных чисел с помощью определенного выше обозначения структурного типа complex можно определить так:
Выше был определен структурный тип "рациональная дробь", для которого введены два имени. С их помощью так вводятся конкретные структуры:
Кроме изложенной последовательности определения структур (определяется структурный тип, затем с использованием его имени определяются структуры) в языке Си имеются еще две схемы их определения. Во-первых, структуры могут быть определены одновременно с определением структурного типа:
structимя_структурного_типа
{ определения_элементов }
список_структур;
Пример одновременного определения структурного типа и структур (объектов):
Здесь определен структурный тип с именем student и три конкретные структуры student_l, student_2, student_3, которые являются полноправными объектами. В каждую из этих трех структур входят элементы, позволяющие представить имя (name), фамилию (surname), курс (year), на котором обучается студент.
После приведенного определения в той же программе можно определять любое количество структур, используя структурный тип student:
Следующий вариант определения структур является некоторым упрощением приведенного варианта. Дело в том, что можно определять структуры, приведя "внутреннее строение" структурного типа, но не вводя его названия. Такой безымянный структурный тип обычно используется в программе для однократного определения структур: