Средства препроцессора. Условная компиляция. Параметры функции main( ). Динамическая память. Функции с неопределённым количеством параметров. Типы данных: структура, перечисление, объединение, страница 2

va_start(param_pt, number);  // Запуск макроса va_start,  для получения адреса   number

va_arg(param_pt, int) – извлечение целого числа из памяти, на которую в данный момент показывает param_pt

В завершении работы с макросами необходимо всё «убрать и  подчистить». Для этого используется макрос:

va_end(param_pt);

Использование Макросов позволяет писать программы для извлечения из памяти последовательно  записанные там аргументы (параметры) функции, независимо от Типа аргументов. Но тип должен указать программист.

5)  программа  Dc_5.с

Создание указателя на функцию.

Машинные коды для выполнения функции хранятся в памяти компьютера.

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

Такой указатель должен иметь тип. Тип можно взять из типа  «прототипа функции».

Таким образом можно построить указатель на функцию. Указатель на функцию может работать с разными функциями, имеющими одинаковый прототип.

Это и демонстрирует пример.

Посмотрите, что в примере вызываются функции через УКАЗАТЕЛЬ.

Попробуйте, как работают закоментированные строки.

Объясните почему это так.

6)  программа  Dc_6.*

Пример, как записываются структуры на Си.

Создается новый тип данных - date

structdate                            date  - это название нового типа данных

{

intmonth;                         - члены (элементы,поля) структуры

intday;

intyear;

};   - обязательно наличие ; - для определения нового типа данных

structdatedate1,  *date_point;    - создание объекта типа date (выделение под него памяти) в С,

                                                            создание указателя для такого типа

(исправьте строку в программе  перед компиляцией.)

   date1.day=5;                       так можно напрямую обратиться к члену структуры

   date_point = &date1;          указатель можно направить на определенный объект

Тогда с таким объектом можно работать через указатель, используя косвенную адресацию:

   (*date_point).year = 1938;

В С++ появилясь операция «стрелка» -> , позволяющая записать такое обращение короче:

        date_point -> month = 10;

   Вывод полей структуры осуществлен с помощью функции printf

7)  программа  Dc_7.*

Создание списка (множества) именованных констант

enum day{mon=1, tue, wed, thu, sat=6};

Значения не введенных констант на 1 превышат предыдущую константу

mon= 1

tue  = 2

wed= 3

thu  = 4

sat  = 6

Если заменить в этом ряду значение какой-либо константы (wed=1 ), то поменяется и весь последующий ряд значений.

enum day{mon=1, tue, wed=1, thu, sat=0};   

Значения не введенных констант на 1 превышат предыдущую константу

mon =  1

tue   =  2

wed  =  1

thu    = 2

sat    = 0

Перечисление также вводит новый тип данных.

dayabc;

Это «ограниченный» тип данных.

 Попробуйте, как работают все закоментированные строки.

8)  программа  Dc_8.*