2) Доступ к элементу структуры можно выполнить с помощью операций: точка (.) - прямой доступ или стрелка ( -> ) - доступ по указателю.
Структурная переменная может использоваться так же, как и переменные типов float, int, char и т. д.
Например:
struct date /* объявление шаблона структуры типа date */
{ int day, month, year;
};
struct person /*Шаблон структуры типа person */
{char fam[30], //Фамилия
im[20], //имя
otch[15]; //отчество
float weight; //вес
int height; //рост
struct date birthday; //День рождения
}
Структура date имеет три поля типа int. Шаблон структуры person включает поле birthday, которое, в свою очередь, имеет ранее объявленный тип данных: struct date. Этот элемент (birthday) содержит в себе компоненты шаблона struct date.
11.3. Определение структур-переменных
Если описатель структуры записан до размещения всех функций в исходном файле, то он будет доступен каждой из функций в этом файле. При определении структурной переменной можно инициализировать (останавливать значения полям структуры). Например
struct date { int day, month, year;};
d[5]={ { 1,3,1980}, { 5,1,1990}, { 1,1,2002} };
11.4. Размещение структурных переменных в памяти
Число байтов, выделенное под структурную переменную, не всегда равно сумме дли отдельных ее элементов из-за некоторых особенностей работы процессора с данными с фиксированной и плавающей точкой, что приводит к так называемому «выравниванию», размещению элементов с четного адреса.
При размещении структурной переменной в памяти для выравнивания на границу слова компилятор оставляет между ее элементами и элементами массива структурных переменных пустые байты для соблюдения следующих правил:
- Структурная переменная (элемент массива структур) начинается на границе слова, т. е. с четного адреса; Любой элемент, кроме элементов типа char, также располагается с четного адреса и соответственно имеет четное смещение от начала структурной переменной; При необходимости в конец структурной переменной добавляется неиспользуемый байт для того, чтобы общее число байтов, занимаемых переменной, было четным.
Практическое занятие № 12
Тема. Размещение полей битов в структурах
Цель: Рассмотреть использование в структурах особого типа полей – полей битов, которые делают возможным доступ к отдельным битам более крупных объектов.
Краткие теоретические сведения по теме
Использование полей битов целесообразно в том случае, когда для хранения информации в структуре данных достаточно несколько битов.
Общий синтаксис описания битового поля:
Тип [имя]: ширина;
Рассмотрим каждое поле описания.
ПОЛЕ «тип»
В Borland C++ для определения содержимого битового поля разрешено использовать тип, интерпретируемый как целый: char, short, int, long ( с модификаторами signed, unsigned), перечисления. В полях типа signed крайний левый бит является знаковым. Например, при объявлении поля типа signed шириной в один байт (например, signed а:1;) оно будет способно хранить только –1 или 0, так как любая ненулевая величина будет восприниматься как (-1) .
ПОЛЕ «имя»
Ссылка на битовое поле выполняется по имени, указанному в поле «имя». Если имя в данном поле не указано, то запрошенное количество бит будет отведено, но доступ к ним будет невозможен.
Разрешается описание поля битов без имени и с шириной равной 0 – в этом случае следующее поле будет начинаться с границы целого.
ПОЛЕ «ширина»
Каждому полю выделяется точно столько битов, сколько указано в поле «ширина». Данное выражение должно иметь неотрицательное значение. Это значение не может превышать числа разрядов, требуемого для представления значения типа, указанного в поле «тип».
Объявление структуры, содержащей поля битов имеет следующий вид:
struct имя_структуры
{ тип [имя 1]:ширина;
тип [имя 2]:ширина;
тип [имя N]:ширина;
};
Рассмотрим примеры объявления битовых полей. Объявление шаблона:
struct bitfld1
{ int a:2;
unsigned b:3;
};
Объявление шаблона и определение переменных:
struct bitfld2
{ int a:1;
unsigned b:2;
int :4;
int c:4;
unsigned d:10;
} bf1, bf2;
12.1. Размещение полей битов в памяти
Поля битов располагаются в машинном слове справа налево, т. е. в направлении от младших разрядов к старшим в очередности их объявления. Если обратиться к общему объявлению структуры с полями битов описанному выше, то размещение полей в памяти можно представить следующим образом:
Старшие Разряды машинных слов Младшие
Имя N....................................................имя2 имя1
Если общая ширина полей битов в структуре не кратна восьми (т. е. некоторые битовые поля будут не полностью занимать байт), то соответствующее количество битов данного байта будет свободно. Например:
struct EXAMPLE
{ unsigned a:3;
int b:2;
};
Данная запись обеспечит следующее размещение полей в памяти:
Разряды байта
Знаковый бит
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Не используются | b | а |
12.2. Доступ к полям битов. Инициализация полей битов. Недопустимые действия
Доступ к полям битов осуществляется так же, как и к другим элементам структурной переменной, т. е. с помощью операции выбора элемента “.”. Например:
struct EXAMPLE
{ int a:2;
unsigned int b:3;
unsigned int c:6;
int d:1;
} exam;
Доступ к объявленным полям в данном примере происходит следующим образом:
Exam. a – доступ к полю “a”;
Exam. b – доступ к полю “b” и т. д.
При работе с битовыми полями недопустимы:
- Массивы битовых полей; Указатели на битовые поля; Функции, возвращающие битовые поля.
Практическое занятие № 13
Тема. Объединения
Цель: Ознакомиться с понятием объединения, с объявлением, инициализацией объединения. Рассмотреть указатель на объединение, размещение объединений в памяти.
Краткие теоретические сведения по теме
Объединение – это особый тип данных языка Borland C++, называемый составным типом. Фактически объединение – это переменная, которая позволяет в разные моменты времени хранить значения различных типов. Объединение может содержать и структурные переменные. Его особенностью является то, что все данные, включенные в объединение, располагаются в памяти с одной и той же границы (адреса), т. е. они перекрывают друг друга.
Объединение обычно является частью структуры. Отдельные данные, входящие в объединение, в дальнейшем будем называть полями.
13.1. Объявление объединения
Как и любая переменная, объединение должно быть определено. Определение состоит из двух шагов:
- Задание шаблона объединения; Собственно описание переменной-объединения.
В дальнейшем непосредственно переменную – объединение будем называть просто объединением.
Шаблон создается при помощи ключевого слова union с использованием следующего синтаксиса:
Union [<имя>]
{тип поле1;
тип поле2;
...
тип полеN;
};
где <имя> - имя описываемого шаблона, удовлетворяющее правилам задания идентификаторов языка Borland C++; тип – любой тип языка Borland C++; поле1...полеN – имена полей данных, входящих в объединение, удовлетворяющие правилам задания идентификаторов языка Borland C++.
Поскольку описание шаблона на самом деле является оператором языка, то в конце ставится точка с запятой.
Например, описание простейшего шаблона объединения имеет вид:
union EXAMPLE
{int i;
char ch[2];
};
Поле, являющееся объединением, называют вложенным объединением. Шаблон вложенного объединения должен быть уже известен компилятору. Например:
union ENCLOSE
{char ch;
int im[10];
};
union EXAMPLE
{char chm[20];
union ENCLOSE enc1;
}enclose_union;
13.2. Инициализация объединения
При определении объединения разрешается выполнять его инициализацию. Особенностью инициализации объединения является то, что переменная может быть проинициализирована значением только для первого описанного поля.
Например:
union EXAMPLE1
{ int i;
char ch[4];
float f;
};
union EXAMPLE1 exam = {12346};
В данном примере вначале был задан шаблон с именем EXAMPLE1, затем по заданному шаблону была определена переменная exam и проинициализирована целым числом 12346, так как первое поле данного объединения имеет тип int. Попытка каким-либо образом проинициализировать данную переменную значениями для полей ch или f приведет к ошибки.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |


