关于C语言可变参数函数的写法及其应用

以前一直以为C语言的函数都是精确匹配的,直到看了 C和C指针 才知道还有可变参数的函数。仔细一想,平时最常用的printf ,scanf 不就是可变参数的吗。
先上代码,随后详细讲解可变参数函数的用法。

#include<stdio.h>
#include<stdarg.h>

void fun(int num, ...)
{
	int i;
	int res = 0;
	va_list v1;				//v1实际是一个字符指针,从头文件里可以找到 
	
	va_start(v1, num);		//使v1指向可变列表中第一个值,即num后的第一个参数 
	
	printf("*v = %d\n",*v1);
	
	for(i = 0; i < num-1; i++)	//num 减一是为了防止下标超限 
	{
		res = va_arg(v1, int);		//该函数返回v1指向的值,并是v1向下移动一个int的距离,使其指向下一个int 
		printf("res = %d, *v1 = %d\n",res, *v1); 
	 } 
		va_end(v1);				//关闭v1指针,使其指向null
}


int main(void)
{
	fun(4,1,2,3,4);
	
	return 0;
 } 

这个函数简单的介绍了可变参数函数的用法。
首先,必须包含stdarg.h 头文件,我们用到的东西,都在这个头文件中。包括 va_list,va_start,va_arg, va_end。
va_list 用于定义一个指向参数的指针,其实就是一个char* 的指针。
va_start(v1, num); 将v1指针指向可变参数的第一个参数。通过打印*v1可知,打印出来的是,1 ,正是第一个可变参数。
res = va_arg(v1, int); 这个函数返回v1指针所指的值,并使v1指针
移动sizeof(int) = 4, 个字节,使其指向下一个参数。以前一直以为当参数类型为char 时,应该写char, 但是今天实践了一下发现,当为char时系统会自动提升为int,当为float时自动提升为double, 字符串时为char * 。。。。…
va_end(v1); 最后一句,为了安全性,关闭v1指针,其实就是使v1为null。
本文关于可变参数函数的介绍就到这里。想要深入理解的可以去看看头文件里面的定义。

猜你喜欢

转载自blog.csdn.net/canhelove/article/details/83421134
今日推荐