- •Передача в функции переменного числа параметров
- •Макрос 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 - объединение (куча) - подобно структуре в том,
- •Доступ к полям объединения выполняется через
- •Пример:
Пример объявления битовых полей: unsigned color : 4;
unsigned underline : 1;
Содержимое битового поля может описываться как имеющее знак (signed), так и как беззнаковое (unsigned) - эти ключевые слова записываются в поле тип. Каждому полю выделяется точно столько бит, сколько задается в поле ширина. Ссылка на битовое поле выполняется по имени, указываемому в поле имя. Если имя в этом поле опущено, запрошенные биты все равно выделяются, но доступ к ним невозможен > надо учитывать длину машинного слова при работе с битовыми полями.
Все манипуляции с битовыми полями являются машинно-зависимыми. В некоторых компьютерах битовые поля могут даже пересекать границы машинного слова, тогда как в других компьютерах это не допустимо. Неименованные битовые поля вводятся для округления объемов памяти до машинного слова, т.е. для заполнения оставшихся неиспользуемыми бит.
struct names
{
char * P_Family; char * P_Name; char * P_SecName;
};
typedef struct
{
unsigned lymph_ unsigned : 11; //ровняем names Patient; //
int structure:1; //0 // 1
int cell_sructure:3;
2 – кубическая, 3 – цилиндрическая,
4 – полигональная, 5-столбчатые,
6 – веретеновидная, 7 – есть миот. aктивность */ int cell_membrane:1; //0 – тонкая, 1 - грубая
int cell_membrane_state:2; //0 – ровная, 1 - неровная
При ссылке на поле в выражениях по маске
выделяются нужные биты и при необходимости выполняется сдвиг числа вправо.
В результате это число вступает в операцию в соответствии с типом как число со знаком или без него.
При ссылке на битовое поле слева от операции присваивания выполняется обратная операция: сдвиг числа вправо, выделение по маске нужных битов и размещение их в структурной переменной поразрядной логической операцией с предыдущим содержимым поля.
ВНИМАНИЕ!!! Используйте, только если очень надо экономить место (на диске, в памяти) !!!
Проблем больше, чем преимуществ
Union - объединение (куча) - подобно структуре в том,
что содержат поля различных типов, но помещаемые в одно и то же место памяти, т. е. доступ к одному и тому же месту памяти, но по-разному.
Как и для структур, различают шаблон объединения и переменную, созданную по шаблону.
Ключевым различием объединения и структурной переменной является то, что все поля объединения начинаются с одной границы.
Длиной объединения является максимальная из длин отдельных полей шаблона.
Тип поля может быть любым, в том числе и структурой.
Доступ к полям объединения выполняется через
селектор поля '.', либо ссылка формируется операцией ->, если для доступа используется указатель на объединение.
Разрешается создание массива объединений.
Объединение может инициализироваться только первым описанным полем.
Применения объединений:
доступ к одной и той же области памяти либо как к целому, либо к отдельным частям;
формирование целого из частей, например, far- указателя по известным значениям смещения и сегмента;…..
экономия динамической памяти.
Не всегда переносится на другие компьютеры и платформы: зависит от соглашения о выравнивании в
памяти типов данных объединения
Пример:
union diagnosis
{
char code; int ID;
char *d_name;
}
ОСТОРОЖНО!!!! ИСПОЛЬЗОВАТЬ ТОЛЬК В КРАЙНЕМ СЛУЧАЕ!!!!
Создает новый тип, но не переменную для даль- нейшего использования надо объявить переменную этого типа. Обращение – как к элементам структуры
. . .
diagnosis diag1, dial2; char * s=‘lymph_node’; diag2. d_name=s; diag1.code=‘N’;
. . .
ВАЖНО!!! Следите, какое значение внесли в кучу последним!!! Если далее сразу написать
int ID=diag1.ID, получите бессмысленное значение, а