1. 前言
通过stdarg.h
头文件中的方法可以实现函数的可变参数列表,实现如printf、scanf函数类似的参数传递功能
#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
2. 方法介绍
- va_list
相关方法中,都需要使用到va_list类型参数,va_list类型的变量是指向参数列表的指针 - va_start
va_start方法,第一个参数是指向参数列表的指针,第二个参数是参数列表中最后一个可以确定类型的参数名,通过这两个参数可以确定可变参数的起始地址 - va_arg
第一个参数va_list类型,得到可变参数的地址,第二个参数是可变参数的类型,结合两个参数返回可变参数的值 - va_end
把va_list变量置为空指针
3. 具体实现
- printf如何声明
int printf(const char *format, ...);
,其中format即使用时""
中包括的字符串数据,其中的%
占位符可以标识其后可变参数 - 自实现可变个数个int值相加
#include <stdarg.h>
#include <stdio.h>
int add(int n, ...) {
va_list ap;
va_start(ap, n);
int res = 0;
int ii = 0;
for (ii = 0; ii < n; ii++) {
res += va_arg(ap, int);
}
return res;
}
int main() {
int a = 1;
int b = 2;
int c = 3;
printf ("%d", add(3, a, b, c));
return 0;
}