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