可变参数:就是在函数传递时,希望不固定函数参数的个数进行传递,让一个函数在不同的时候接受不同数目的参数!
注意:参数列表中至少有一个命名参数;
内部实现,其实可变参列表是通过宏来实现的,这些宏定义于stdarg.h这个头文件声明了一个类型va_list 和三个宏---------va_start , va_arg , va_end
现在看看这个强大的功能:
看个代码:
<span style="font-size:14px;">#include<stdio.h>
#include<stdarg.h>
float savage(int n,...)//stdarg.h里面的宏,直接使用
{
va_list arg; //一个char*的指针
int count;
float sum = 0;
va_start(arg,n); // 是让这个arg的指针首先指向栈顶,然后再绕过int n
for(count = 0;count < n;count ++)
{
sum += va_arg(arg,int);//让arg的指针先指向后面一个数,然后再减去一个int(基本类型)再解引用
}
va_end (arg);
return (sum/n);
}
float avage(int n,...)//我自己写的把内部的实现,
{
char *p;
int i = 0;
float sum = 0;
//va_start(arg,n);//让头指针指向头
p = (char *)(&n)+sizeof(n);
for(i = 0;i < n;i ++)
{
//sum += va_arg(arg,int);
sum += *(int* )((p += sizeof(int)) -sizeof(int) );
}
*p = NULL;
return (sum/n);
}
int main()
{
printf("%f\n",savage(7,44,56,78,90,65,87,9));
printf("%f\n",savage(3,2,'s',3));
printf("%f\n",avage(7,44,56,78,90,65,87,9));
printf("%f\n",avage(3,2,'s',3));
return 0;
}</span>
这就是可变参的强大功能!简化了好多步骤.