c语言中的可变长参数的函数小例子:
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
static int pp;
void func1()
{
    static int pp1;
    printf("hello world\n");
}
void tiny_printf(char *format, ...)
{
    int i;
    va_list ap;
    va_start(ap, format);
    for (i = 0; format[i] != ‘\0‘; ++i)
    {
        switch (format[i])
        {
        case ‘s‘:
            printf("%s ", va_arg(ap, char*));
            break;
        case ‘d‘:
            printf("%d ", va_arg(ap, int));
            break;
        default:
            assert(0);
        }
    }
    va_end(ap);
    putchar(‘\n‘);
}
int main(void)
{
    char *str = "abc";
    tiny_printf("sdd", "hello", 3, 5);
    return 0;
}
在第14行,声明va_list类型的变量ap。va_list类型是这样定义的: 
typedef char *va_list; 
在第15行,va_start(ap, format);意味着”使指针ap指向参数format的下一个位置”。 
va_arg()制定ap和参数类型,就可以书序地取出可变长部分的参数。 
第30行的va_end()只是一个摆设。
原文:http://blog.csdn.net/woniu317/article/details/45579749