在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能。 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参数,然后执行相应的动作。
如果要自己编写参数可变的函数时,必须按照下面的步骤进行:
下面使用一个简单的例子来演示。
#include <stdarg.h>
int sum(int num, ...)
{
va_list list;
int total;
int i;
va_start(list,num);
for(i=0;i<num;i++)
total += va_arg(list,int);
va_end(list);
return total;
}
要使用可变参数必须添加头文件 stdarg.h。
首先定义一个函数,函数中第一个参数必须是形参的个数,最后一个参数必须是可变参数,用 … 来表示,可变参数前面可以有多个参数,但是可变参数必须是最后一个参数。
接下来在函数体内定义一个参数列表,它的类型为va_list ,它用来存储每次读取到的参数。
然后使用 va_start() 把参数列表拷贝到 va_list 类型的变量中。
它有两个参数,第一个是用于存储参数的列表,第二个参数是要读取参数的数量。
接下来使用 va_arg() 函数从参数列表中依次读取各个参数,它有两个参数,第一个参数用来存储读取从参数列表中读取到的参数,第二个参数是待读取参数的类型。这里需要读取的参数都是 int 型,所以第二个参数就是 int,如果要读取的类型是 double 型,那么第二个参数就必须是 double 型。在这里要读取多个参数,所以就使用一个循环去依次读取。
最后当所有的参数都读取完成后,就使用 va_end() 宏完成清理工作,释放存储参数时动态分配的内存。
下面编写一段代码来测试。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int sum(int num, ...)
{
va_list list;
int total;
int i;
va_start(list,num);
for(i=0;i<num;i++)
total += va_arg(list,int);
va_end(list);
return total;
}
int main(int argc, char *argv[])
{
int s;
s= sum(3,5,3,9);
printf("%d\r\n",s);
system("pause");
return 0;
}
在主函数中调用可变参数的函数,传递给sum()函数总共有4个参数,第一个参数为3,说明后面跟着的可变参数数量是3个。然后再sum()函数中,就会使用循环读取3次,然后使用 total 变量累加3个参数的和。当sum()函数退出时就会返回三个参数的累加和。程序运行结果如下:
改变参数数量后继续测试。
改变参数的个数后,程序依然可以正确执行。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_20222919/article/details/121289270
内容来源于网络,如有侵权,请联系作者删除!