Лекция 18.02.16
Структуры языка Си
Структуры, как агрегатный тип данных Агрегатными называют типы данных, которые содержат в себе элементы других типов данных. Один из примеров – массивы. Агрегатные типы имеют внутреннюю организацию, которая называется структурой. Во многих задачах бывает удобно объединить в одном объекте данных данные разных типов. Массивы для этого не годятся. Поэтому в языках программирования имеются инструменты, позволяющие объединять в единый объект разнородные данные. В Паскале это записи, в Си – это структуры. Отдельные элементы структуры будем называть полями. Если в массивах доступ к отдельным элементами обеспечивается с помощью числового индекса, то в структурах каждое поле получает своё имя. Поэтому объявление структурного типа выглядит сложнее, чем объявление массива. Для массива достаточно задать тип элементов и их количество, а для структуры нужно определить тип и имя каждого поля. Определяя структурный тип, мы создаём новый тип данных, который удобен для решения нашей задачи. Разработка структурных типов относится к этапу проектирования.
Структуры ещё не являются полноценным типом данных, потому что тип данных это множество значений + множество операций с ними. Операции со структурами можно выполнять с помощью функций, но эти функции определяются отдельно от структурного типа.
Объявление структурных типов.
Объявление структурного типа начинается со служебного слова struct. Обычно структурный тип имеет имя, которое иногда называют тегом. Тег это ярлык. Сам структурный тип определяется как совокупность определений отдельных полей, заключенный в фигурные скобки.
struct complex { float real ; float imag; } ;
или можно было описать в одной строке – float real, imag;
Выше объявлен структурный тип с названием struct complex
Struct complex z;
Объявление структурного типа это объявление шаблона, по которому будут создаваться объекты этого типа.
Поля структурного типа могут иметь базовые типы данных, быть массивами или структурными данными. Однако поле структуры не может иметь тот же тип что и сама структура.
struct my_struct { … struct my_struct ms; … } ;
Это невозможно, потому что когда компилятор создаёт объект структурного типа он должен выделить для него память, а для этого сначала нужно вычислить размер структуры. В общем случае размер структурного типа является результатом суммирования отдельных его полей. Если поле имеет тот же тип что и сама структура, то возникает бесконечная рекурсия, и размер подсчитать нельзя. Однако поле структуры может иметь тип указателя на свою структуру.
После того, как объявлен структурный тип, он может использоваться не только для определения переменных, но и при описании аргументов функций и возвращаемого значения. Есть возможность совместить определение структурного типа с определением переменных:
Struct my_struct { float real; float image; } ; z1,z2, zz[10];
Объявления структурных типов могут быть размещены на глобально м или локальном уровне. На локальном уровне они должны быть помещены в начало блока вместе с остальными определениями. Расположение объявления влияет на область действия объявления. Можно создавать структурный тип без имени. Это имеет смысл в том случае, если нам нужно только в одном месте программы определить переменную этого структурного типа. Анонимным структурным типом больше нигде нельзя будет воспользоваться. Имена структурных типов могут совпадать с именами своих полей и с именами переменных.
struct name { int name; } ; name;
Но делать этого не нужно.
