Программирование >>  Структурное программирование 

1 ... 281 282 283 [ 284 ] 285 286 287 ... 342


Приведенное объявление структуры не предусматривает выделения какой-либо области памяти; более уместно сказать, что объявление структуры создает новый тип данных, который может использоваться в дальнейшем при объявлении переменных типа структуры. Переменные типа структуры объявляются аналогично переменным других типов. Объявление

Card а, deck[52[, *с;

объявляет а - переменную типа структуры Card, deck - массив с 52 элементами типа Card и с - указатель на структуру типа Card. Переменные заданного типа структуры могут также объявляться с помош;ью списка разделенных запятыми имен переменных, расположенного между закрывающейся фигурной скобкой и точкой с запятой, завершающей объявление структуры. Например, предыдущее объявление можно включить в описание структуры Card следующим образом :

struct Card {

char *face;

char *suit; } a, deck[52], *c;

Имя структуры является необязательным. Если объявление структуры не содержит ее имени, то переменные структурного типа могут быть объявлены только в описании структуры, а не с помощью их отдельного объявления.

Хороший стиль программирования 16.1

При создании типа аруктуры следует предусмотреть и создание имени аруктуры. Имя аруктуры удобно использовать в дальнейшем для объявления новых переменных типа данной структуры.

Допустимыми операциями, которые могут быть выполнены со структурами, являются только следующие: операция присваивания одной структуры другой структуре того же типа, операция адреса (&) структуры, операции доступа к элементам структуры (см. главу 6 Классы и абстрагирование данных ) и операция sizeof для определения размера структуры. Как и при использовании классов, большинство операций может быть перегружено, чтобы работать с объектами типа структур.

Типичная ошибка программирования 16.2

Присваивание аруктуры одного типа структуре другого типа.

Элементы структуры не обязательно сохраняются в последовательных байтах памяти. Иногда при сохранении структур в памяти возникают дырки , потому что компьютеры могут хранить данные определенных типов только в областях памяти с определенными границами, таких, например, как машинное полуслово, машинное слово или двойное машинное слово. Машинное слово (или просто слово) - стандартная единица (элемент) памяти, используемая для хранения данных в компьютере; обычно это 2 или 4 байта.

Чтобы понять проблемы, возникающие при выравнивании, рассмотрим следующее описание, в котором объявляются переменные типа структуры (фактически объекты) samplel и sample2:



01100001

00000000

01100001

Рис. 16.1. Возможный вариант выравнивания памяти для переменной типа Example Замечание по мобильности 16.1

Поскольку размер данных-элементов определенного типа является машинно-зависимым и выравнивание памяти тоже является машинно-зависимым, то и представление структуры также машинно-зависимо.

16.3. Инициализация структур

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

Card а = ( Tree , Hearts );

создает переменную а, которая является структурой типа Card (описанной ранее), и задает элементу face начальное значение Tree , а элементу suit начальное значение Hearts . Если инициализаторов в списке меньше, чем число элементов в структуре, то оставшимся элементам автоматически присваиваются нулевые начальные значения (или значение NULL, если элемент является указателем). Переменные типа структуры, объявленные вне описания функции (т.е. внешние) получают начальные значения элементов, равные О

struct Example {

char с;

int i; } samplel, sample2;

В компьютере, в котором слово равно 2 байтам, может требоваться, чтобы каждый из элементов структуры Example был выровнен относительно границ слова, например, относительно начала слова (это зависит от компьютера). На рис. 16.1 показан пример выравнивания области памяти для объекта типа Example, которому присвоен символ а и целое число 97 (показаны значения битов). Если эти элементы хранятся, начиная с границы слова, то в памяти для объектов типа Example возникает дырка размером в один байт (байт 1 на рисунке). Значение в этой дырке в один байт не определено. Даже если значения элементов структур samplel и sample2 действительно равны, то не обязательно при сравнении они окажутся равными друг другу, поскольку маловероятно, что неопределенные дырки в один байт содержат одинаковые значения.

Типичная ошибка программирования 16.3

Сравнение структур является синтаксической ошибкой из-за разных требований по выравниванию в разных системах.

Байты 0 12 3



или NULL, если только они не инициализированы явным образом во внешнем объявлении. Переменные типа структуры могут быть также инициализированы операторами присваивания путем присваивания переменной значения другой структуры того же типа (тем самым задаются значения сразу всем элементам) или путем присваивания значений отдельным данным-элементам структуры.

16.4. Использование структур в функциях

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

Чтобы передать структуры вызовом по ссылке, следует передать в функцию адрес переменной структуры. Массивы структуры (аналогично всем другим массивам) автоматически передаются вызовом по ссылке.

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

Типичная ошибка программирования 16.4

Ошибочно предполагается, что структуры подобно массивам автоматически передаются вызовом по ссылке и предпринимается попытка изменить в вызываемой программе значения структуры в вызывающей функции.

Совет по повышению эффективности 16.1

Передача аруктур (особенно больших структур) вызовом по ссылке является более эффективной, чем передача структур вызовом по значению, при которой необходимо копировать всю структуру.

16.5. Создание синонимов

Синонимы (или псевдонимы) для определенных ранее типов данных создаются с помощью ключевое слово typedef. Имена типов структур часто переопределяются с помощью typedef для применения более коротких или более удобных для чтения имен типов. Например, оператор

typedef Card* CardPtr; определяет новое имя типа CardPtr как синоним типа Card *.

Хороший стиль программирования 16.2

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



1 ... 281 282 283 [ 284 ] 285 286 287 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика