可变参数列表解析

在C语言的函数使用过程中要先进行函数声明,声明的内容为:

       1,函数的返回类型;

       2,函数的名称;

       3,函数的参数;

  例如下面这个简单的ADD函数:

//普通方式的ADD函数:
#include <stdio.h>
int ADD(int a,int b,int c)
{
	int sum = 0;
	sum = a + b;
	sum = sum + c;
	return sum;
}
int main()
{
	int a = 2;
	int b = 4;
	int c = 5;
	int sum = ADD(a, b, c);
	printf("%d\n", sum);
	return 0;
}

它的输出结果为:

上面的这个ADD函数就用三个参数(int a,int b,int c)),那么在我们的函数参数未知的情况下,我们的函数参数将声明。那么这种情况该怎么办呢?

这就要说到我们的可变参数列表了。

下面就是使用可变参数列表实现ADD函数的代码:

//可变参数列表实现ADD函数:
#include <stdio.h>
#include <stdarg.h>
int ADD(int n, ...)
{
	va_list arg;
	int i = 0;
	int sum = 0;
	va_start(arg,n);
	for (i = 0; i < n; i++)
	{
		sum = sum + va_arg(arg, int);
	}
	return sum;
	va_end(arg);
}
int main()
{
	int a = 2;
	int b = 4;
	int c = 5;
	int n = 3;
	int sum = ADD( n, a, b, c);
	printf("%d\n", sum);
	return 0;
}

它的输出结果和上面代码的输出结果一致。但是它的函数参数声明(int n, ...)却与上面代码有很大的区别。

普通ADD函数参数声明:(int a,int b,int c)

可变参数列表ADD函数参数声明:(int n, ...)

这是为什么呢?想要解决这个问题,让我们来解析一下可变参数列表:

  1. (int n, ...)

其中“int n”为声明函数参数的个数;“...”为参数的未确定部分;

(接下来,我们就讲如何用上面的声明方式来得到函数的参数)

2.(va_list arg;):

我们首先来看看它的定义:

它的作用就是给一个变量声明类型。

此处的变量为“arg”,所以"arg"被声明为一个"char * va_list"的变量。

3.(va_start(arg,n);):

我们来看一下它的定义:

它的作用就是初适化一个地址,并且确定单个参数的类型,以便地址进行移动访问。

此处初始化地址为“arg”,它指向的就是可变参数部分的第一个参数,单个参数类型为“int”型。

4.(va_arg(arg, int);):

我们来看一下它的定义:

它的作用就是返回当前指向的可变参数列表中的参数值,并且使自身指向下一个可变参数列表中的参数值。而它每次移动的空间大小就是由参数的类型决定的,只有这样才能每次正确读取并且跳过一个参数。

此处的参数类型为“int”型,所以每次移动4个字节。

5.(va_end(arg);)

我们来看一下它的定义:

它的作用就是使指针为空指针,停止可变参数列表的读取。

以上就是我自己对可变参数列表的分析和理解,如果有错误或没有理解到的地方欢迎大家指正和补充。在格式上有什么好的建议也欢迎提出来。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值