📜  C语言中的可变长度参数

📅  最后修改于: 2021-05-25 19:55:24             🧑  作者: Mango

可变长度自变量是一种功能,它允许函数接收任意数量的自变量。在某些情况下,我们希望函数根据需要处理可变数量的参数。
1)给定数字的总和。
2)最小给定数目。
还有很多。

可变数量的参数由三个加注号(…)表示

下面是一个示例,用于查找给定整数集的最小值。

// C program to demonstrate use of variable
// number of arguments.
#include 
#include 
  
// this function returns minimum of integer
// numbers passed.  First argument is count
// of numbers.
int min(int arg_count, ...)
{
    int i;
    int min, a;
  
    // va_list is a type to hold information about
    // variable arguments
    va_list ap;
  
    // va_start must be called before accessing
    // variable argument list
    va_start(ap, arg_count);
  
    // Now arguments can be accessed one by one
    // using va_arg macro. Initialize min as first
    // argument in list
    min = va_arg(ap, int);
  
    // traverse rest of the arguments to find out minimum
    for (i = 2; i <= arg_count; i++)
        if ((a = va_arg(ap, int)) < min)
            min = a;
  
    // va_end should be executed before the function
    // returns whenever va_start has been previously
    // used in that function
    va_end(ap);
  
    return min;
}
  
// Driver code
int main()
{
    int count = 5;
    printf("Minimum value is %d", min(count, 12, 67, 6, 7, 100));
    return 0;
}

在这里,我们使用宏来实现可变参数的功能。

  • 在函数定义中使用va_list类型变量。
    int a_function(int x, ...)
    {
        va_list a_list;
        va_start( a_list, x );
    }
  • 使用int参数和va_start宏将va_list变量初始化为参数列表。宏va_start在stdarg.h头文件中定义。
  • 使用va_arg宏和va_list变量访问参数列表中的每个项目。
  • 宏va_end清除分配给va_list变量的内存。

另一个例子 :

// C program to demonstrate working of 
// variable arguments to find average
// of multiple numbers.
#include 
#include 
  
int average(int num, ...)
{
    va_list valist;
  
    int sum = 0, i;
  
    va_start(valist, num);
    for (i = 0; i < num; i++) 
        sum += va_arg(valist, int);
  
    va_end(valist);
  
    return sum / num;
}
  
// Driver code
int main()
{
    printf("Average of {2, 3, 4} = %d\n",
                         average(2, 3, 4));
    printf("Average of {3, 5, 10, 15} = %d\n",
                      average(3, 5, 10, 15));
    return 0;
}

输出:

Average of {2, 3, 4} = 3
Average of {3, 5, 10, 15} = 10
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。