#include <stdarg.h>
#include <stdio.h>
double average ( int num, ... )
{
va_list arguments;
double sum = 0;
int x;
/* Initializing arguments to store all values after num */
va_start ( arguments, num );
//printf("arguments = %d...........num = %d",arguments,num);
for(x = 0; x < num; x++ )
{
sum += va_arg ( arguments, double );
}
va_end ( arguments ); // Cleans up the list
return sum / num;
}
int main()
{
printf( "Average 2 = %f\n", average ( 3, 12.2, 22.3, 4.5 ) );
printf( "Average 3 = %f\n", average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3 ) );
printf( "Average 4 = %f\n", average ( 9, 3.3, 2.2, 1.1, 5.5, 3.3,
3.10, 13.3, 143.312, 39.35 ) );
}
我们正在使用: - va_start ( arguments, num );
这里包含的参数是什么?我对此很困惑。 当我试图打印它时,我没有得到我作为参数传递的值。请解释
答案 0 :(得分:0)
关于您的问题:您不应该关心arguments
真正包含的内容,因为这取决于您的主机架构和编译器的实现。通常,它可以是指向堆栈上可以找到下一个参数的位置的指针,但它也可以是其他任何东西。
va_list
及其周围的宏背后的想法是提供一致的API,您可以在任何架构上使用以相同的方式来获取参数,而无需知道如何他们在内部处理。 va_list
因此就是你所说的黑匣子(通过它的API使用它,不要看里面)。只需依靠va_init()
和va_arg()
从中获取参数。