C语言不定参数的函数

(1)va_list 

     定义了一个指针arg_ptr, 用于指示可选的参数.

(2)va_start(arg_ptr, argN)
使参数列表指针
arg_ptr指向函数参数列表中的第一个可选参数argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va函数的声明是void va_test(char a, char b, char c, ...), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start(arg_ptr, c).

(3)va_arg(arg_ptr, type)
返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.
(4)va_end(arg_ptr)
清空参数列表, 并置参数指针arg_ptr无效.

举例:

#include 
#include 
#include 

/*功能打印第一个不定参数,和所有参数之和(包括固定参数)*/
int sumi(int c, ...)
{
    va_list argptr;//定义指针argptr
    va_start(argptr, c); //初始化变元指针,c等于不定参数的前一个固定参数
    int sum = c;
    c = va_arg(argptr, int); //作为下一个参数类型的参数类型,返回不定参数
    //c保存第一个不定参数
    printf("%d\n", c);//打印第一个不定参数
    while(0 != c) //末尾特定字符指示结束
    {
        sum = sum + c;
        c = va_arg(argptr, int);
    }
    va_end(argptr);
    return sum;
}
/*功能:num是不定参数的个数,求出不定参数的总和*/
double sum_series(int num, ...)
{
    double sum = 0.0, t;
    va_list argptr;
    va_start(argptr, num);//初始化变元指针
    while (num--)
    {
        t = va_arg(argptr, double);//double是返回类型
        sum = sum + t;
    }
    va_end(argptr);
    return sum;
}

int main()
{
    int i = sumi(1,2,3,4,5,6,7,8,9,0);//这里2,...,0是可选的参数,2是第一个不定参数
    printf("%d\n", i);
    double d = sum_series(4, 1/3.0, 1/4.0, 1/5.0, 1/6.0);//注:不定参数要用浮点数
    printf("%f\n", d);

    return 0;
}



你可能感兴趣的:(c/c++语言)