Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
29.04.2018
Размер:
824.83 Кб
Скачать

Void proc(man *p)

{ cout<< p->name;

cout<< p->d<<'.'<< p->m<<'.'<< p->y;

}

Void main()

{

proc (&B);

}

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

Указатель на структуру как результат функции

Объекты типа структур можно передавать в качестве результата.

man *find(man *p, int n)

{ int i;

for(i = 0; i<n; i++)

if(p[i].name[0] =='\0')

return(&p[i]); //или return(p+i);

return(NULL);

}

(&p[i]) - результат

Вложенные структуры

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

#include <iostream>

using namespace std;

struct Date //вложенная структура

{ int day, month, year; };

struct student

{ char *name;

Date bd;

};

struct puple

{ char *name;

Date *bd;

};

Void main()

{ student *pA; int c, d;

student A = {"Петров", 1, 03, 2000};

pA = &A;

c = A.bd.day;

cout << c << endl; //c = 1

d = pA -> bd.day;

cout << d <<endl; //d = 1

puple *pB;

Date f = {2, 10, 20101};

puple B = {"Сидоров", &f};

pB = &B;

c = B.bd -> day;

cout << c << endl; //c = 2

d = pB -> bd -> day;

cout << d << endl; //d = 2

}

Cоздание псевдонима с помощью typedef

Typedef позволяет определить производный тип данных и использовать его аналогично базовым типам

Объединения

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

Объединение подобно структуре, однако в каждый момент времени может использоваться только один из элементов объединения.

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

union идентификатор_объединения

{ описание элемента 1;

   ………………….

   описание элемента n

};

Когда исп. элемент меньшей длины, то перем. типа объединения м. содержать неиспользуемую память.

union Info

{ char name[30];

int age;

Int telephon;

} Inf ;

using namespace std;

Void main()

{ Inf.telephon = 1234567;

Inf.age = 20;

cout<<Inf.age<<endl;

cout<<Inf.telephon<<endl;

}

При использовании объекта Inf типа union можно обрабатывать только тот элемент, который получил значение, т.е. после присвоения значения элементу Information.age не имеет смысла обращаться к другим элементам.

Надо сначала присвоить им значения.

Inf.telephon = 1234567;

Допустимые операции:

 операция присваивания значения одного объединения другому объединению того же типа;

 операция вычисления адреса объединения (&);

доступ к элементу объединения при помощи операций .  и  –>

Над объединениями нельзя выполнять операции сравнения. 

Свойства объединений:

  • размещение всех членов объединения начинается с одного и того же адреса;

  • в любой момент времени можно присвоить значение лишь одному члену;

  • не бывает статических членов;

  • не бывает членов, являющихся ссылками.

Типичной ошибкой является инициализация объединения при его объявлении значением или выражением, тип которого отличается от типа первого элемента объединения.

Можно вместо трех структур:

создать одну

Перечисления

Перечисление это объект, значения которого выбираются из фиксированного множества идентификаторов, называемых константами перечислимого типа.

enum Lang

{ C, Java, Ada, PHP, Basic

} mr;

Здесь определяется  новый перечислимый тип  Lang с пятью целыми  константами,  называемыми  перечислителями,  и присваиваются  им  значения. 

Значения  перечислителей  по умолчанию  начинаются с  0 в  порядке  возрастания,  т.е. это эквивалентно записи: const C = 0; const Java = 1; const Ada = 2; и т.д.

Имя перечисления  становится синонимом  int, а  не  новым  типом.

enum key{ A, B, C };

……………………

key n;

switch (n)

{ case A: …….. break;

case B: ……. break;

. . . . . . . . . . . . . . . . . . .

}

Задавать значения перечислителей можно явно:

enum Lang

{ C = 0, Java = 2,

Ada, PHP = 9

} ;

Тем константам, значения которых явно не заданы, присваивается значение предшествующей константы, увеличенное на единицу

Т.о., константе Java соотв. значение 2, а константе Ada – знач. 3. Разным константам перечислимого типа м. соотв. одно и то же значение.

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

Практическое назначение перечисления – определение множества различающихся символических констант целого типа. 

Битовые поля

Битовые поля - это специальный тип структуры, в котором определено, из скольких бит состоит каждое поле.

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

Элементы битового поля должны быть объявлены как тип int  или unsigned.

Вне структур битовые поля объявлять нельзя.

Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса &.

struct 

{ unsigned идентификатор 1 :  длина_поля_1;

   unsigned идентификатор 2 : длина_поля_2;   

}

Длина-поля задается целым выражением или константой. Эта константа определяет число битов, отведенное соответствующему полю.

Битовое поле рассматривается как целое число, максимальное значение которого определяется длиной поля.

struct number

{ unsigned group: 4; // 4 бита – числа от 0 до 15

unsigned department: 3; // 3 бита – числа от 0 до 7

  unsigned course: 3; // 3 бита – числа от 0 до 7

}

Это описание включает три битовых поля типа unsignedgroup,  department и course, используемых для предст. номера зачетки. При объявл. битового поля вслед за unsigned или int ставится двоеточие (:) и пишется целочисл. константа, задающая ширину поля (т.е. число битов, в кот. хранится этот член структуры).

Для хранения члена group выделено 4 бита, для department –  3 бита и для course  – 3 бита. Колич. битов определяется ожидаемым диапазоном значений для каждого члена структуры. Член структуры group хранит значения от 0 до 12  в области памяти размером 4 бита (4 бита, выдел. для элемента group, м. хранить значения от 0 до 15). Член структуры department м. хранить значения от 0 до 8 (факультеты). Область памяти размером 3 бита, выделенная для члена course, б. хранить значения от 0 до 4 (диапазон от 0 до 8).

Сгенерируем номера зачеток:

number Fit[90];

……………………………….

Соседние файлы в папке Лекции