Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014_2015 / LECT7_new1.pptx
Скачиваний:
9
Добавлен:
27.12.2015
Размер:
1.12 Mб
Скачать

Когда задан шаблон, может быть описана

структурная переменная. Описание структурной переменной состоит из задания типа и имени структурной переменной. Например:

struct Patient first_Patient;

Здесь описывается структурная переменная по приведенному ранее шаблону Patient. Компилятор выделит под переменную число байт памяти, достаточное для хранения всех ее полей.

Число байт, выделенное под структурную переменную, не всегда равно сумме длин отдельных полей из-за влияния дополнительного фактора внутреннего представления структурных переменных, называемого выравниванием.

Точно выделенное число байт всегда возвращает операция sizeof (struct имя_шаблона). Например, sizeof

(struct Patient).

Синтаксис языка программирования С++ (C)

разрешает совмещать описание шаблона и структурной переменной, например так:

struct Patient

{

int PatientID;

char * PatientFamily; char * PatientName; char * PatientSecName; int year;

char * Diagnosis; int DiagnosisID;

} first_Patient, second_Patient;

Для структурных переменных действуют правила видимости и времени жизни.

Для доступа к отдельным полям структурной переменной используют операцию '.', формируя

ссылку на нужное поле посредством имени

Такая ссылка может располагаться в любом месте

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

first_Patient.year=1981; second_Patient.DiagnosisID =18; // корь first_Patient. DiagnosisID = second_Patient.DiagnosisID;

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

При описании структурной переменной разрешается выполнять инициализацию полей переменной.

В С++ разрешается объединять задание шаблона, описание структурных переменных и их инициализацию.

struct Patient

{

int PatientID;

char * PatientFamily; char * PatientName; char * PatientSecName; int year;

char * Diagnosis; int DiagnosisID;

}

Patient1 ={12, “Ivanov”, ”Vasilyi”, ”Sergeevich”, 1967, ”influenza” , 21},

Patient2 = {13, ”Vasin”, ”Ivan”, ”Petrovich”, 1975, “leukemia”, 14};

Для упрощения описания структурных переменных можно использовать оператор typedef описания собственного типа данных. Общая форма конструирования собственного типа данных:

typedef описание_типа имя_нового_типа;

typedef struct Patient

{

int PatientID;

char * PatientFamily; char * PatientName; char * PatientSecName; int year;

char * Diagnosis; int DiagnosisID;

} Patients;

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

Patients first_patient, second_patient;

Здесь используется для создания собственного типа именованный шаблон Patient.

Однако использование имени шаблона совсем не

обязательно, т. е. можно записать: typedef struct

{

int PatientID;

char * PatientFamily; char * PatientName; char * PatientSecName; int year;

char * Diagnosis; int DiagnosisID;

} Patients;

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

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

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

Пример - для вложенных структур действуют те же

правила описания полей: задается шаблон (в данном примере это struct names) и имя поля (в шаблоне Patient это PatientN):

typedef struct

{

char * P_Family; char * P_Name; char * P_SecName;

} names; struct Patient

{

int PatientID;

struct names PatientN; int year;

char * Diagnosis; int DiagnosisID;

} first_patient, second_patient;

Ссылка на поле вложенной структуры формируется из

имени структурной переменной, имени структурного поля и имени поля вложенной структуры. Перечисленные имена разделяются символом '.' операции точка. Например, если сделано описание структурных переменных по приведенному ранее шаблону Patient с вложенной структурой PatientN, будут корректны следующие выражения:

printf(“%s %c.%c. - %s\n”, first_patient.PatientN. P_Family, first_patient.PatientN.P_Name[0], first_patient.PatientN.P_SecName[0], first_patient.Diagnosis);

printf(“%s %s %s - %s\n”, second_patient.PatientN.P_Family, second_patient.PatientN.P_Name, second_patient.PatientN.P_SecName, second_patient.Diagnosis);

ограничение на вложение структур состоит в том, что

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

struct Patient

{

struct Patient Patient1; /* это ошибка */ int year;

char * Diagnosis; int DiagnosisID;

};

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

Описание шаблона структуры вводит по существу новый тип ничего не мешает использовать указатель на введенный тип (near, far и т.д.). Для доступа к полям структурной переменной через

указатель используется операция ->.

Пример: typedef struct

{

char * P_Family; char * P_Name; char * P_SecName;

} names; struct Patient

{

int PatientID; names PatientN; int year;

char * Diagnosis; int DiagnosisID;

}

struct Patient *ptr_patient, first_patient, second_patient;

. . .

ptr_patient = &first_patient; ptr_patient -> year=1979;

Соседние файлы в папке 2014_2015