b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c strchr函数_c语言strchr函数_c strchr函数自定义(3)

电脑杂谈  发布时间:2017-02-21 22:18:53  来源:网络整理

#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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...