C语言之可变参函数
1、什么是可变参函数
(1)在C语言里,可变参函数(variadic function)指的是可以接受个数不确定、类型也不完全固定的参数的函数。
(2)最典型的例子就是标准库里的printf / scanf家族。
2、头文件与 4 个必备的宏
#include <stdarg.h>
stdarg.h
里提供了 4 个宏:
(1)va_list ap;
- 声明一个“参数指针”变量。
(2)va_start(ap, last);
- 把 ap 指向第一个可变参数;
- last 必须是函数形参中最后一个“固定参数”。
(3)va_arg(ap, type);
- 取出一个 type 类型的值,同时 ap 自动后移。
(4)va_end(ap);
- 清理,必须与 va_start 成对出现
(5)C99 又补充了 va_copy(va_list dst, va_list src);
- 用于拷贝遍历状态。
3、示例代码
#include <stdio.h>
#include <stdarg.h>int Sum(int count, int data, ...)
{int sum = data; /* 第一个数已拿到 */va_list ap;va_start(ap, data); /* 从第二个数开始遍历 */for (int i = 1; i < count; ++i){sum += va_arg(ap, int);}va_end(ap);return sum;
}int main(void)
{printf("Sum = %d\n", Sum(5, 10, 20, 30, 40, 50)); /* 5 个数:10+20+30+40+50 */return 0;
}
4、原理
(1)如下函数:参数a、b、c在内存中的地址是递增的。如果数据类型相同,当我们知道了a的地址,也就可以知道b和c了,也就可以访问b和c了。
int add(int a, int b, int c);
(2)如下函数:如果知道了起始参数a的地址,和后续参数的类型,就可以得到后续参数的内存地址,便可以访问了。
- 参数传入char类型,会被提升为int类型;
- 所以说可变参数函数中至少需要一个确定的参数。
int add(int a, ...);