- •Передача в функции переменного числа параметров
- •Макрос va_start имеет синтаксис:
- •Ф-я average, которая рассчитывает среднее значение
- •Функцию average можно было бы организовать иначе,
- •Встраиваемые функции inline - снижение расходов
- •Область действия (имени, параметров, объектов) –
- •Операции разрешения области действия
- •Область видимости (имени, параметров, объектов) –
- •Динамическое распределение памяти 3 вида памяти, которую использует программа :
- •Динамически распределяемую память следует использовать в случае если мы заранее (на момент написания
- •После окончания работы с выделенной динамически памятью нужно освободить ее - ф-я free
- •Пример:
- •void *calloc(size_t nmemb, size_t size); (alloc.h)
- •Возвращаемое значение: возвращает адрес блока, который
- •Структуры и объединения – один из примеров
- •Как и любая переменная, структурная переменная
- •Синтаксис задания шаблона таков:
- •Пример. Структура Patient, которая может
- •Задание шаблона не связано с резервированием
- •Когда задан шаблон, может быть описана
- •Такая ссылка может располагаться в любом месте
- •struct Patient
- •typedef struct Patient
- •Однако использование имени шаблона совсем не
- •Пример - для вложенных структур действуют те же
- •Ссылка на поле вложенной структуры формируется из
- •ограничение на вложение структур состоит в том, что
- •Пример: typedef struct
- •Ссылка на поле структурной переменной через
- •Используя указатель на структурную переменную,
- •Пример: typedef struct
- •А если описать рабочий указатель и
- •Выделение оперативной памяти структурной
- •При выравнивании на границе слова компилятор при
- •Передача структур функции: по значению и по адресу.
- •При передаче адреса структуры не происходит ни
- •struct names
- •БИТОВЫЕ ПОЛЯ В СТРУКТУРАХ
- •Пример объявления битовых полей: unsigned color : 4;
- •struct names
- •При ссылке на поле в выражениях по маске
- •Union - объединение (куча) - подобно структуре в том,
- •Доступ к полям объединения выполняется через
- •Пример:
Когда задан шаблон, может быть описана
структурная переменная. Описание структурной переменной состоит из задания типа и имени структурной переменной. Например:
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;