本文有部分的理解借鉴于
https://blog.csdn.net/u012005313/article/details/52122077
该文比较基础,适合新手,如需进阶请看上面的文章。
本文只是自己的理解,如果有错误的地方评论区请指出,谢谢。
首先引入头文件:
#include<stdarg.h>
需要可变的参数列表要用…来代替。
例如: int add(int num, int num2, …)
在stdarg.h头文件中定义了va_list类型,用于遍历参数列表的参数。
void va_start(va_list ap, last);
↑ 该函数用于初始化va_list类型的对象,参数2 last 表示的是函数中已知类型的最后一个参数的名字,ap会指向last的地址。
该函数会把读取的参数列表的首地址放到ap上,ap其实可以理解成一个STL里面的迭代器。
type va_arg(va_list ap, type);
↑ 该函数用于从ap上读取参数,每执行一次,那么ap指向的参数列表首地址就会指向下一个参数
例如: int getchar(int num,char str,char buf);
如果第一次ap会指向char str,当执行一次 type va_arg(va_list ap, type); 的时候,ap会指向char buf;
参数2的 type是该函数返回的变量类型。
void va_end(va_list ap);
↑ 该函数用于释放ap的内存空间。
例子:
#include<stdarg.h>
#include<stdio.h>
int add(int num, int num2, ...){
int c = num;//叠加的数值 num2为 可变参数列表的参数个数
va_list arg;
va_start(arg,num2);
for (int i = 0; i < num2; i++){
c += va_arg(arg,int);
}
va_end(arg);
return c;
}
void main(){
int i = 0;
i = add(5, 3, 5, 10, 20);
printf("%d", i);
getchar();
}