- •Рецензенты:
- •Лекция 1 Основные понятия языка с
- •Первая программа
- •Переменные языка с
- •Имя переменной
- •Объявление константы
- •Операции языка с
- •Лекция 2 Операторы языка с Условный оператор
- •Оператор switch
- •Циклы Цикл for
- •Циклы while и do-while
- •Оператор безусловного перехода
- •Использование операторов break, continue и goto в циклах
- •Операция условие ?
- •Лекция 3 Массивы
- •Инициализация массивов
- •Массивы символов. Строки
- •Функции для работы со строками
- •Лекция 4 Указатели
- •Объявление указателей
- •Операции над указателями
- •Связь указателей и массивов
- •Массивы указателей
- •Инициализация указателей
- •Лекция 5 Функции языка с
- •Объявление функции
- •Оператор return
- •Прототипы функций
- •Функции c произвольным числом параметров
- •Область действия и область видимости переменной
- •Классы памяти
- •Параметры и аргументы функции
- •Лекция 6 Типы, определяемые пользователями
- •Структура
- •Перечислимый тип
- •Переименование типов-typedef
- •Лекция 7 Модели памяти и препроцессор языка с Модели памяти
- •Препроцессор языка с
- •Директива #define
- •Список рекомендуемой литературы
- •Оглавление
- •Программирование на языках высокого уровня: с
- •428015 Г.Чебоксары, Московский просп., 15
Функции c произвольным числом параметров
Обычно число параметров функции равно числу аргументов, передаваемых вызываемую функцию. Однако С разрешает использовать функции с произвольным числом параметров. Примерами таких функций могут быть библиотечные функции printf и scanf. Сам программист также может определить свои функции с переменным числом параметров. Для этого нужно подключить файл stdarg.h, в котором предусмотрены макросы, поддерживающие механизм использования функций с переменным числом параметров.
Рассмотрим на примере определение функции с переменным числом параметров:
Программа 5.12
№ |
Строки программы |
Комментарии |
1 |
#include <stdio.h> #include <stdarg.h> //calculate sum of a 0 terminated list |
Подключаем файл stdarg.h |
2 |
Void sum(char *msg, ...) |
Описываем функцию с переменным числом параметров. Список параметров должен содержать по крайней мере один , параметр и должен завершаться многоточием. При этом запятая после последнего фиксированного параметра перед многоточием необязательна, т.е. допускается запись void sum(char *msg ...) |
3 |
{int total=0; |
|
4 |
va_list ap; |
Объявляем переменную типа va_list. Это делается для того, чтобы иметь доступ к аргументам, следующим за последним названным параметром. Этот тип va_list определен в файле stdarg.h. Объявив таким образом переменную ар типа va_list мы создаем возможность для этой переменной содержать адрес одного из аргументов, следующего за последним названным аргументом. |
5 |
int arg; |
|
6 |
va_start(ap, msg); |
Макрос va_start(ap, msg) производит инициализацию механизма доступа к нефиксированным параметрам, причем первый аргумент - это аргумент типа va_list, а второй - последний названный параметр. При этом в переменной ар будет храниться адрес переменной, следующей за переменной msg |
7 |
while ((arg = va_arg(ap,int)) != 0) { |
Чтобы получить значение переменной arg, объявленной целой, и передвинуться к следующему адресу (т.е. к адресу, следующей целой переменно), мы должны использовать макрос va_arg(ap,int), т.е. макрос va_arg(ap,int) выдает значение, хранящееся по адресу ар, и одновременно меняет адрес ар на адрес следующего неназванного параметра функции |
8 |
total+=arg;} printf(msg, total); |
|
9 |
Va_end(ap) |
Макрос va_end(ap) завершает работу c переменной типа va_list |
10 |
int main(void) { sum(" The total of 1+2+3+4 is %d\n", 1,2.3,4,0); return 0; } |
В функции main происходит вызов функции sum с произвольным числом параметров. Индикатором конца списка параметров служит 0 |
Как уже было сказано, примером функции с произвольным числом параметров является функция printf, которая описывается следующим образом:
int printf(const char *format[, argument, ...]);
Приведем пример программы, в которой организуем свою функцию printc, предназначенную для вывода символов по формату %с:
Программа 5.13:
#include <conio.h>
#include <string.h>
#include <stdarg.h>
va_sist args;
va_start(args,s);
int len=strlen(s);
int was = 0;
for(int i=0;i<len;i++) {
if (was) {
was – 0;
if (s[i]== 'c') {putch(va_arg(args,char));}
else {putch('%'); putch(s[i]);}
}
else {if ((s[i]=='%')&&(i != len)) was=l;
else putch(s[i]);
}
void mail() {
char k=’z’;
printc (“%c12%c”, k, w’);
}
