- •Управление esc – последовательность (с примерами)
- •4. Определение констант и их характеристика (const,define,enum)
- •5. Форматные потоки в с. Функции fPrintf(), Fscanf(), и модификации (с примерами). Спецификаторы
- •7. Перегруженные операции.
- •8. Инструкция ветвления. (пример)
- •9. Инструкция switch()
- •10. Применение инструкции switch() для создания текстового меню.
- •11. Инструкция цикла.
- •12. Инструкция перехода.
- •13. Указатели. Операции над указателями. Косвенная адресация.
- •14. Ссылки (пример)
- •15. Статические числовые одномерные
- •16. Статические числовые двумерные массивы.
- •17. Динамическая память.
- •18. Выделение памяти под динамический одномерный и двумерный массив.
- •19. Алгоритм удаления и добавления данных в массив.
- •20. Глобальные, локальные, статические, внешние переменные.
- •21. Классы памяти.
- •22. Формальные и фактические параметры.
- •23. Функции.
- •24. Виды передачи параметров в функцию.
- •25.Функции и массивы
- •26. Функции с переменным числом параметров.
- •27. Шаблоны функции.
- •28.Рекурсии. Фреймы.
- •29. Функция Main()
- •30. Стеки.
- •31. Очереди.
- •33. Строки, как массив символов.
- •34. Функции ввода строковых переменных.
- •35.Основные функции обработки строковых переменных.
- •37. Функции преобразования типов.
- •38. Строки типа string.
- •40. Функции работы с памятью. Memcmp - сравнивает две области памяти
- •41. Структуры
- •42. Вложенные структуры.
- •43. Объединения (union)
- •44.Передача переменных определенных пользователем в функцию.
- •50. Функция определения конца файла.
- •51. Файловый поток.
- •52. Функции tellg и ftell
- •53. Установка файлового указателя
- •55. Обработка текстовых файлов.
- •56. Бинарный файл.
25.Функции и массивы
Смотри билеты: 15-19; 23-27
26. Функции с переменным числом параметров.
Если точное количество формальных аргументов функции изначально не известно, допускается указывать многоточие в списке аргументов:
void имя_функции(int first, float second, . . . ) ;
Данный прототип говорит компилятору о том, что за аргументами first и second могут следовать и другие аргументы, если возникнет такая необходимость. При этом тип последних не контролируется компилятором.
В следующей программе, написанной на языке С, создается функция vsmalltest( ) с переменным числом аргументов. Текст этой программы может вам показаться трудным для понимания, поскольку мы еще не рассматривали подробно работу с указателями.
В таком случае рекомендуем вернуться к этой программе после прочтения главы "Указатели".
/*
* ellipsis. с
* Эта программа на языке С содержит пример функции с переменным числом
* аргументов и демонстрирует использование макросов va_arg, va_startи va_end. */
#include ‹stdio.h›
#include ‹stdarg.h›
#include ‹string.h›
void vsmallest (char *szmessage, ...);
intmain() { vsmallest("Выводим %dцелых чисел, %d %d %d",10,4, 1);
return (0);
} void vsmallest (char *szmessage, ...) { int inumber_of_percent_ds = 0;
va_listtype_for_ellipsis;
int ipercent_d_format = 'd';
char *pchar; pchar = strchr (szmessage, ipercent_d_format) ;
while (*++pchar != '\0'){ pchar++; pchar = strchr (pchar, ipercent_d_format) ;
inumber_of_percent_ds++;
} printf{"Выводим%d целых чисел,",inumber_pf percent_ds) ;
va_start(type_for_ellipsis, szmessage);
while(inumber_of_percent_ds--) printf(" %d", va_arg(type_for_ellipsis, int));
va_end(type_for_ellipsis); }
Функция vsmallest() ожидает двух формальных аргументов: указателя на строку и списка неопределенной длины. Естественно, функция должна иметь возможность каким-то образом определить, сколько же аргументов она получила на самом деле. В данной программе эта информация передается в строковом аргументе.
Созданная нами функция vsmallest() частично имитирует работу стандартной функции printf (). Аргумент szmessage рассматривается как строка форматирования, в которой подсчитывается число спецификаций %d. Полученная информация позволяет вычислить количество дополнительных аргументов. Функция strchr() возвращает адрес позиции спецификатора d в строке форматирования. Первый элемент %d игнорируется, поскольку на его месте будет выведено общее число аргументов. В первом цикле while определяется количество спецификаторов d в строке szmessage, и полученное значение заносится в переменную inumber_of_percent_ds.
По завершении цикла на экран выводится первая часть сообщения. Макрос va_start() устанавливает указатель type_for_ellipsis(обратите внимание на его тип — va_list) в начало списка аргументов функции. Второй параметр макроса является именем обязательного аргумента анализируемой функции, который стоит непосредственно перед многоточием. Макрос va_arg() возвращает очередной аргумент из списка.
Второй параметр макроса указывает на тип возвращаемого аргумента (в нашей программе это тип int). Макрос va_end() очищает указатель type_for_ellipsis, делая его равным нулю.