提到变参函数,我们的感觉是不是既熟悉又陌生?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变参函数。因为printf()函数是变参函数我们才可以根据我们的需要灵活地输出变量的值。如:
printf("hi"); //给printf函数传入1个参数 printf("%d\n",a); //给printf函数传入2个参数 printf("%s %d", str, a); //给printf函数传入3个参数 ... ... //给printf函数传入n个参数
我们可以根据需要给printf()函数传入n个参数,这就是变参函数。
感觉陌生是因为我们没有试着创建变参函数。要创建变参函数需要包含头文件stdarg.h
,并且创建变参函数应按照如下步骤进行:
【第一步】
定义一个使用省略号的函数原型,如printf()与scanf()函数的原型为
int printf (const char *__format, ...) int scanf (const char*, ...);
【第二步】
在函数定义中创建一个va_list
类型的变量,用于存储不定的参数;
【第三步】
用宏va_start
把该变量初始化为一个参数列表;
【第四步】
用宏va_arg
访问参数列表;
【第五步】
用宏va_end
完成清理工作。
示例程序:
#include <stdio.h> #include <stdarg.h> /*【第一步】:定义一个使用省略号的函数原型 */ double sum(int lim, ...) { /*【第二步】:声明一个va_list类型的变量ap */ va_list ap; double sum = 0; // 用于保存参数之和 int i; /*【第三步】:使用va_start把变量ap初始化为参数列表 */ va_start(ap, lim); for (i = 0; i < lim; i++) { /*【第四步】: 使用va_arg访问参数列表。 这里第二个参数是double类型,传入的不定参数就应是double类型 */ sum += va_arg(ap, double); } /*【第五步】:使用va_end完成清理工作 */ va_end(ap); return sum; } int main(void) { double sum1 = 0, sum2 = 0; /* 计算 */ sum1 = sum(3, 1.1, 2.2, 3.3); sum2 = sum(6, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0); printf("sum1 = %f\n", sum1); printf("sum2 = %f\n", sum2); return 0; }
变参函数sum()用于求lim个数之和,并且这lim个数的类型必须是double类型,因为sum函数实体中使用va_arg访问参数列表中的参数类型为double类型。
程序输出结果为:
以上就是小编关于可变参数的一点小总结。
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句