c语言中对可变参数列表的简单理解

函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现。

可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中。头文件中声明了一个va_list类型和va_start、va_arg、va_end三个宏。我们使用可变参数列表的时候需要声明一个va_list类型的变量配合这三个宏使用。

va_start(va_list变量名,省略号前面最后一个有名字的参数):在提取可变参数前必须调用这个宏实现初始化。

va_arg(va_list变量名, type_of_var):用于提取变量,type_of_var是提取的变量的类型。返回对应类型的参数。

va_end(va_list变量名):在参数处理完毕之后,必须调用va_end做一些清理。

下面的例子摘自c和指针

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<string.h>
float average(int n_value,...)  //求指定数量值的平均值
{
 va_list var_arg;      //声明va_list变量
 int count = 0;
 float sum = 0;
 va_start(var_arg, n_value);  //准备访问可变参数
 {
  for (count = 0; count < n_value; count++)
  {
   sum += va_arg(var_arg, int);
  }
  va_end(var_arg);   //完成可变参数的处理
  return sum / n_value;
 }
}
int main()
{

 printf("%lf\n", average(6,1,2,3,4,5,6));
 system("pause");
 return 0;
}

上面的例子是实现求指定数量值的平均值的可变参数列表实现办法。

当然可变参数的应用还有很多比如实现字符串的拷贝

#define _CRT_SECURE_NO_WARNINGS

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

void nstrcpy(char *dest, ...)
{
 va_list     pi;   //声明va_list变量
 char        *p;
 va_start(pi, dest);
 while ((p = va_arg(pi, char *)) != NULL)   //通过va_arg(pi,char *)来提取参数列表中的变量  
 {
  strcpy(dest, p);
  dest += strlen(p);        //复制完成一个变量进行下一个的复制
 }

 va_end(pi);
}

int main()
{
 char a[100];
 char *b = "asdg";
 char *c = "qwewq";
 char *d = "aswq";
 nstrcpy(a, b, c, d);
 printf("%s\n", a);
 system("pause");
 return 0;
}

完成多个字符串的拷贝。

对可变参数列表的简单理解,对于三个宏具体的定义还不是很明白,等彻底搞清楚了再来完善关于可变参数列表的博客。

你可能感兴趣的:(C语言,可变参数列表)