C语言学习笔记---可变参数

x33g5p2x  于2021-11-12 转载在 其他  
字(1.3k)|赞(0)|评价(0)|浏览(401)

在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能。 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参数,然后执行相应的动作。

如果要自己编写参数可变的函数时,必须按照下面的步骤进行:

  1. 提供一个使用省略号的函数原型。
  2. 在函数定义中创建一个va_list类型的变量。
  3. 用宏把该变量初始化为一个参数列表。
  4. 用宏访问参数列表。
  5. 用宏完成清理工作。

下面使用一个简单的例子来演示。

#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()函数退出时就会返回三个参数的累加和。程序运行结果如下:

  改变参数数量后继续测试。

  改变参数的个数后,程序依然可以正确执行。

相关文章