C语言 使用stdarg.h实现函数可变参数

本文有部分的理解借鉴于
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();

}

猜你喜欢

转载自blog.csdn.net/u013594490/article/details/93727342