#include
#include
int average( int first, … ); //输入若干整数,求它们的平均值
void main( void )
{
/* 调用3个整数(-1表示结尾) */
printf( “Average is: %d\n”, average(2,3,4, -1));
/*调用4个整数*/
printf( “Average is: %d\n”, average(5,7,9, 11,-1));
/*只有结束符的调用*/
printf( “Average is: %d\n”, average(-1) );
}
/* 返回若干整数平均值的函数 */
int average( int first, … )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); //初始化
while( i != -1 )
{
sum += i; //先加第一个参数
count++;
i = va_arg( marker, int);//取下一个参数
}
va_end( marker );
return( sum ? (sum / count) : 0 );
}
//输出结果
Average is: 3
Average is: 8
Average is: 0
五、关于可变参数的传递问题
有人问到这个问题,假如我定义了一个可变参数函数,在这个函数内部又要调用其它可变参数函数,那么如何传递参数呢?上面的例子都是使用宏va_arg逐个把参数提取出来使用,能否不提取,直接把它们传递给另外的函数呢?
我们先看printf的实现:
int __cdecl printf (const char *format, …)
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format); //arglist指向format后面的第一个参数
。。。//不关心其它代码
retval = _output(stdout,format,arglist); //把format格式和参数传递给output函数
。。。//不关心其它代码
return(retval);
}
我们先模仿这个函数写一个:
#include
#include
int mywrite(char *fmt, …)
{
va_list arglist;
va_start(arglist, fmt);
return printf(fmt,arglist);
}
void main()
{
int i=10, j=20;
char buf[] = “This is a test”;
double f= 12.345;
mywrite(”String: %s\nInt: %d, %d\nFloat :%4.2f\n”, buf, i, j, f);
}
运行一下看看,哈,错误百出。仔细分析原因,根据宏的定义我们知道 arglist是一个指针,它指向第一个可变的参数,但是所有的参数都位于栈中,所以arglist指向栈中某个位置,通过arglist的值,我们可以直接查看栈里面的内容:
arglist -> 指向栈里面,内容包括
0067FD78 E0 FD 67 00 //指向字符串”This is a test”
0067FD7C 0A 00 00 00 //整数 i 的值
0067FD80 14 00 00 00 //整数 j 的值
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33745-3.html
独一无二的小王子
美国明白的时候已经晚了