Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1.docx
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
364.88 Кб
Скачать

Инициализация структур и объединений.

При создании переменной типа структура она может быть проинициализирована набором данных, перечисленных через запятую внутри фигурных скобок. Синтаксис записи очень похож на инициализацию массивов. Например, структура, описывающая трёхмерную точку, может быть проинициализирована следующим образом:

struct Point

{

int x;

int y;

int z;

}

p1 =

{1,2,3};

Если структура уже описана, то для описания и инициализации новой переменной можно воспользоваться сокращённой записью:

struct Point p2 = {3,4,5};

Инициализация более сложных структур, в т.ч. с элементами-массивами и вложенными структурами можно осуществляется аналогично инициализации многомерных массивов, т.е. в состав набора данных инициализирующего структуру (заключённого в фигурные скобки) включают вложенные наборы данных, например:

struct STOCK_INFO

{

char Name [32]; // Наименование фирмы

int Quantity; // Количество

int CustomersIDs[10]; // Идентификаторы покупателей

struct Prices // Цены

{

int MinPrice;

int MaxPrice;

int AveragePrice;

}

}

сurrent =

{

“IBM Inc“, // Наименование фирмы

45, // Количество

{0,1,2,3,4,5,6,7,8,9}, // Идентификаторы покупателей

{10,100,48} // Цены

} ;

Как видим, в данном случае элементы-массивы инициализируются либо константой-строкой (для Name) либо вложенным набором элементов (для CustomersIDs). Вложенная структура (Prices) также инициализируется вложенным набором элементов.

В принципе, при инициализации сложных структур можно просто перечислить их элементы через запятую, не используя сложенных наборов данных, однако при этом очень сложно определить какое инициализирующее значение относится к какому элементу.

Аналогичным образом можно инициализировать и объединения, однако для объединений при инициализации надо указывать только значение для его первого элемента. Например:

union CompInt

{

int i;

struct

{

short LoWord;

short HiWord;

}

}

MyVal = {10}; // Значение для элемента i;

Сравните это со следующей записью:

union CompInt

{

struct

{

short LoWord;

short HiWord;

}

int i;

}

MyVal = {{10,0}}; // Значения для элементов LoWord и HiWord;

Выгода от использования структур

Резюмируя всё вышесказанное можно перечислить следующие положительные стороны использования структур:

  1. Структурированная запись данных, с которыми работает программа, значительно улучшает её читаемость. Структуры полнее отображают смысл данных.

  2. Структурированные данные легче передавать в функции – вместо набора параметров достаточно передать один параметр – структуру.

  3. Использование структур упрощает расширение программы. При необходимости, можно просто добавить ещё один элемент в структуру, больше ничего не изменяя в программе – новый параметр будет передаваться между функциями внутри структуры. Если же использовать для нового элемента отдельную переменную, то программисту придётся изменить описание всех функции, работающие с этими данными дабы обеспечить передачу в функции нового параметра.

  4. Работать со структурами и объединениями не сложнее чем с основными типами. Принципы работы остаются те же самые, но в начале типа надо добавлять ключевые слова struct или union. При объявлении же производных типов в виде пользовательского типа (с помощью typedef) эти различия и вовсе пропадают.

  5. К структурам и объединениям, также как и к основным типам, применимы операторы взятия адреса переменной(&), и оператор определения длины переменной или типа (sizeof). В качестве операнда оператора sizeof может быть использована как сама переменная, так и производный тип:

i=sizeof(MyVar);

j=sizeof(struct MyStruct);

k=sizeof(union MyUnion);

  1. При работе с файлами, потоками, памятью, можно работать с содержимым структуры как с блоком памяти фиксированной длины. Например, сохранить содержимое всей структуры в файл можно с помощью функции блочной записи в файл, которой сообщают адрес структуры в памяти (взятый с помощью оператора &) и её длину (полученную с помощью оператора sizeof). Например:

write(FileHandle, &MyStruct, sizeof(MyStruct));

  1. Инициализация переменных, структур, массивов.