Здесь Я нашел пример того, как varargs можно использовать в C.
#include <stdarg.h>
double average(int count, ...)
{
    va_list ap;
    int j;
    double tot = 0;
    va_start(ap, count); //Requires the last fixed parameter (to get the address)
    for(j=0; j<count; j++)
        tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
    va_end(ap);
    return tot/count;
}
Я могу понять этот пример только в некоторой степени.
-  
Мне непонятно, почему мы используем
va_start(ap, count);. Насколько я понимаю, таким образом мы устанавливаем итератор в свой первый элемент. Но почему он не установлен в начале по умолчанию? -  
Мне непонятно, почему нам нужно дать
countв качестве аргумента. Не может ли C автоматически определить количество аргументов? -  
Мне непонятно, почему мы используем
va_end(ap). Что это изменит? Установил ли он итератор в конце списка? Но он не установлен в конец списка по циклу? Более того, зачем нам это нужно? Мы больше не используемap; почему мы хотим его изменить?