Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_Структуры.doc
Скачиваний:
7
Добавлен:
02.06.2015
Размер:
103.94 Кб
Скачать

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 Доступ к элементам структур

Наиболее наглядно и естественно доступ к элементам структур обеспечивается с помощью уточненных имен. Конструкция

имя_структуры.имя_элемента

играет роль названия (имени) объекта того типа, к которому отнесен элемент в соответствии с определением структурного типа.

Следует обратить внимание, что перед точкой стоит не название структурного типа, а имя конкретной структуры, для которой ее определением выделена память.

Уточненное имя – это выражение с двумя операндами и операцией «точка» между ними. Операция «точка» называется операцией доступа к элементу структуры. У нее самый высокой ранг наряду со скобками (и операцией «стрелка» для доступа к элементам структуры через адресующий ее указатель).

Уточненное имя используется для выбора правого операнда операции «точка» из структуры, задаваемой левым операндом. Левый операнд должен иметь структурный тип, а правый операнд должен быть именем компонента (элемента) данной структуры. Тип результата операции «точка» ‑ это тип именуемого ею компонента структуры.

Указатель на структуру, настроенный на конкретную структуру того же типа, обеспечивает доступ к ее элементам двумя способами:

(* указатель_на_структуру).имя_элемента

или

указатель_на_структуру->имя_элемента

Первый способ традиционный. Он основан на обратимости операции разыменования (*) и получения адреса (&). Важным является наличие скобок, ограничивающих операцию разыменования (*). Скобки необходимы, так как бинарная операция «точка» имеет более высокий приоритет, чем унарная операция разыменования.

Второй способ доступа к элементам структуры с помощью «настроенного» на нее указателя предусматривает применение специальной операции «стрелка» (->). Операция «стрелка» обеспечивает доступ к элементу структуры через адресующий ее указатель того же структурного типа.

Операция «стрелка» двуместная. Применяется для доступа к элементу, задаваемому правым операндом, той структуры, которую адресует левый операнд. В качестве левого операнда должен быть указатель на структуру, в качестве правого – обозначение (имя) компонента этой структуры.

Операция «стрелка» иногда называется операцией косвенного выбора компонента (элемента) структурированного объекта, адресуемого указателем.