- •1.1 Цель работы
- •1.2 Краткие теоретические сведения
- •1.2.1 Производные типы
- •1.2.2 Структурный тип
- •1.2.3 Определения структур
- •1.2.4 Выделение памяти для структур
- •1.2.5 Инициализация и присваивание структур
- •1.2.6 Доступ к элементам структур
- •1.2.7 Массивы структур
- •1.2.8 Операции над указателями на структуры
- •1.3 Варианты заданий к практической работе №1
1.2.4 Выделение памяти для структур
Определение структурного типа не связано с выделением памяти, а при каждом определении структуры (объекта) ей выделяется память в таком количестве, чтобы могли разместиться данные всех элементов.
Однако, никаких гарантий о непрерывном размещении элементов структур стандарт языка С не дает. Причиной появления неиспользованных участков памяти («дыр») могут явиться требования выравнивания данных по границам участков адресного пространства. Эти требования зависят от реализации, от аппаратных возможностей системы и иногда от режимов (опций) работы компилятора.
Необходимость в выравнивании данных зависит от конкретной задачи. Например, доступ к целым значениям выполняется быстрее, если они имеют четные адреса, то есть выровнены по границам машинных слов. Противоположное требование состоит в плотной «упаковке» информации, когда идет борьба за уменьшение объема, занимаемого в памяти структурой или массивом структур.
В зависимости от наличия «пропусков» между элементами изменяется общий объем памяти, выделяемый для структуры. Реальный размер памяти в байтах, выделяемый для структуры, можно определить с помощью операции sizeof(имя_структуры)
sizeof(имя_структурного_типа)
1.2.5 Инициализация и присваивание структур
Инициализация структур похожа на инициализацию массивов. Непосредственно в определении конкретной структуры после ее имени и знака = в фигурных скобках размещается список начальных значений элементов.
struct goods {
char * name;//наименование
long price;//оптовая цена
float percent;//наценка в процентах
int vol;//объем партии
char date [9];//дата поставки партии
};
struct goods coat = {
“пиджак черный”, 4000, 7.5, 220, «12.01.97»
};
Стандарт языка С разрешает присваивание структур. Однако для структур не определены операции сравнения даже на равенство. И сравнивать структуры нужно только поэлементно.
1.2.6 Доступ к элементам структур
Наиболее наглядно и естественно доступ к элементам структур обеспечивается с помощью уточненных имен. Конструкция
имя_структуры.имя_элемента
играет роль названия (имени) объекта того типа, к которому отнесен элемент в соответствии с определением структурного типа.
Следует обратить внимание, что перед точкой стоит не название структурного типа, а имя конкретной структуры, для которой ее определением выделена память.
Уточненное имя – это выражение с двумя операндами и операцией «точка» между ними. Операция «точка» называется операцией доступа к элементу структуры. У нее самый высокой ранг наряду со скобками (и операцией «стрелка» для доступа к элементам структуры через адресующий ее указатель).
Уточненное имя используется для выбора правого операнда операции «точка» из структуры, задаваемой левым операндом. Левый операнд должен иметь структурный тип, а правый операнд должен быть именем компонента (элемента) данной структуры. Тип результата операции «точка» ‑ это тип именуемого ею компонента структуры.
Указатель на структуру, настроенный на конкретную структуру того же типа, обеспечивает доступ к ее элементам двумя способами:
(* указатель_на_структуру).имя_элемента
или
указатель_на_структуру->имя_элемента
Первый способ традиционный. Он основан на обратимости операции разыменования (*) и получения адреса (&). Важным является наличие скобок, ограничивающих операцию разыменования (*). Скобки необходимы, так как бинарная операция «точка» имеет более высокий приоритет, чем унарная операция разыменования.
Второй способ доступа к элементам структуры с помощью «настроенного» на нее указателя предусматривает применение специальной операции «стрелка» (->). Операция «стрелка» обеспечивает доступ к элементу структуры через адресующий ее указатель того же структурного типа.
Операция «стрелка» двуместная. Применяется для доступа к элементу, задаваемому правым операндом, той структуры, которую адресует левый операнд. В качестве левого операнда должен быть указатель на структуру, в качестве правого – обозначение (имя) компонента этой структуры.
Операция «стрелка» иногда называется операцией косвенного выбора компонента (элемента) структурированного объекта, адресуемого указателем.