可变参数列表的解析。



首先在解析可变参数列表之前,我们先看一看main函数的参数解析。首先main函数的原型为:

int main(int argc,char *argv[],char *envp[])
{
program-statements
}

这里有三个参数:

第一个参数:argc是个整形变量,表示命令行参数的个数(含第一个参数)。

第二个参数:argv是个字符指针的数组,每个元素是一个字符指针,指向一个字符串。这些字符串就是命令行中的每个参数。

第三个参数:envp是字符指针数组,数组的每一个原元素是一个指向一个环境变量(字符串)的字符指针。

总之argc表示参数的个数,argv数组的最后一个元素存放了一个NULL的指针,并且envp数组也同上存放了NULL指针。

接下来我们来学习可变参数列表:在C语言中的可变参数是一个比较有意思的的实现,通过将函数实现为可变参数的形式,可以使得函数可以接受一个或一个以上的任意多个参数。(不固定)

同时可变参数要被使用要知道:(1)每个传入参数的类型。(2)一共传入了多少个参数。

举一个例子:实现一个函数求任意个参数的平均值。

#include<stdio.h>
#include<Windows.h>
int average(int n, ...)                      //定义一个求平均值可变形参。...表示可变参数。
{
 va_list arg;                         //访问参数列表的未确定部分
 int i=0;
 int sum=0;
 va_start(arg,n);                     //初始化过程把arg变量设置为指向可变参数部分的第一个参数。
 for(i=0;i<n;i++)                     //循环求得每个参数的和,在输出平均值。
 {
  sum+=va_arg(arg,int);
 }
 return sum/n;
 va_end(arg);                         //使arg指向空。
}
int main()
{
 int a=12;
 int b=14;
 int n=average(2,a,b);           //得到平均值。
 printf("n=%d\n",n);
 system("pause");
 return 0;
}

可变参数的限制:(1)可变参数必须从头到尾逐个访问。如果你在访问了几个可变参数之后想半途终止,这是可以的,但是如果想一开始就访问参数列表中间的参数,那是不行的。(2)参数列表中至少有一个命名参数,如果连一个都没有,就无法使用va_start。(3)这些宏是无法直接判断实际存在参数的数量。(4)这些宏无法判断每个参数的类型。(5)如果在va_arg中指定了错误的类型,那么后果是不可预测的。并且最重要的是:可变参数的实现过程是使用宏的封装。

最后总结一下在编程可变参数时的主要步骤:(1)首先使用va_list 变量 来访问参数列表的未确定部分。这个是指向参数的指针。(2)其次使用va_start初始化过程使arg变量设置为指向可变参数部分的第一个参数。(3)然后再用va_arg返回可变的参数并赋值,它返回的第二个参数是你要返回参数的类型。(4)最后用va_end结束可变参数的获取。

猜你喜欢

转载自blog.csdn.net/ymk1507050118/article/details/80283111
今日推荐