简单网站建设流程图,自己做网站的难度,shopify做国内网站,无锡手机网站建设服务文章目录初步示例函数解析最大值函数初步示例
stdarg.h提供了C语言对可变参数的支持#xff0c;先举一个简短的例子
//testStdArg.c
#include stdarg.h
#include stdio.hvoid printIntList(int N, ...){va_list args; //存放...所代表的参数va_start(…
文章目录初步示例函数解析最大值函数初步示例
stdarg.h提供了C语言对可变参数的支持先举一个简短的例子
//testStdArg.c
#include stdarg.h
#include stdio.hvoid printIntList(int N, ...){va_list args; //存放...所代表的参数va_start(args, N); //初始化变量argsfor (int idx 1; idx N; idx)printf(param %d: %d, , idx, va_arg(args, int));printf(-----\n);va_end(args);
}int main(void)
{printIntList(4,1,2,3,4);printIntList(4,1,2,3);printIntList(3,1,2,3,4);
}编译之后输出结果为
gcc testStdArg.c
a.exe
param 1: 1, param 2: 2, param 3: 3, param 4: 4,
-----
param 1: 1, param 2: 2, param 3: 3, param 4: 4,
-----
param 1: 1, param 2: 2, param 3: 3,
-----函数解析
其中va_list为stdarg.h中声明的数据类型用以存放...所代表的参数在printIntList中定义了va_list类型的args用于存储变量。
在stdarg.h中声明了三个函数在上面的案例中都用上了下面逐一解析
void va_start(va_list ap, last_arg)
用于初始化ap变量last_arg为最后一个参数的下标对于函数printIntList(4,1,2,3,4)而言总共输入了5个参数故其last_arg应该为4。
type va_arg(va_list ap, type)
逐个检索函数参数列表中类型为type参数在printIntList中va_arg被写在一个循环中会逐个检索int型的参数在printIntList(4,1,2,3)中由于N设为4所以va_arg会检索4次最后返回的4实际上是一个野指针。
void va_end(va_list ap)
在参数调用结束之后应该调用va_end来释放ap
最大值函数
有了这个函数就可以实现多个参数求统计参数的功能例如求最大值
//testMax
#include stdarg.h
#include stdio.hdouble getMax(int N, ...){va_list args;va_start(args, N);double val;double max va_arg(args, double);for(int idx2; idx N; idx){val va_arg(args, double);max max val ? max : val;}va_end(args);return max;
}int main(void)
{double a getMax(4,1.2,2.3,3.4,2.5);printf(%f, a);
}测试结果如下
gcc test.c
a.exe
3.400000最后留一个小作业如何用C语言实现一个参数个数可变的复杂一点的应用比如求标准差σ1N∑i1N(xi−xˉ)2\sigma\sqrt{\frac1N\sum^N_{i1}(x_i-\bar x)^2}σN1∑i1N(xi−xˉ)2。
这里面的问题是va_arg相当于是一个不断向前的迭代器但并没有索引的功能所以必须一次性取出而不能跑多次循环。一个最直接的解决方案就是开一个数组或者链表来缓存va_arg中的数据。