对于可变参数函数(需要加头文件为:#include<stdarg.h>)刚刚接触到这个概念的我也是一脸懵逼,完全不知道怎么搞,在翻阅过大量的资料和经过一系列的摸爬滚打之后,我写出了以下几个程序,都是关于怎么使用可变参数函数的,希望对刚刚学习c的小伙伴们一丢丢帮助。
程序一:(用可变参数求平均值)
#include<stdio.h>
#include<stdarg.h> //可变函数必须要引入的头文件
int average(int n,...) //只需要引入传入数据的个数,后边的具体数据用"..."代替
{
int i=0;
int sum=0;
va_list arg;//强制类型转化char* arg
va_start(arg,n);//初始化,指向n前(下文有注释1)的第一个参数,即(1,2,3,4,5)中的1。
for(i=0; i<n; i++)
{
sum+=va_arg(arg,int);//每次获取一个变量,执行一次,往前移动一次。
}
va_end(arg);//结束可变参数函数的使用
return sum/n;
}
int main()
{
int i=average(5,1,2,3,4,5);
printf("%d",i);
system("pause");
return 0;
}
程序二:(用可变参数求最大值)
#include<stdio.h>
#include<stdarg.h>
int MAX(int n,...)
{
int i=0;
int max=0;
int t=0;
va_list arg;
va_start(arg,n);
max=va_arg(arg,int);//将(1,2,3,4,7)中的1赋给max
for(i=0; i<n-1; i++)
{
t=va_arg(arg,int);//将(1,2,3,4,7)中的2赋给t,因为va_arg(arg,int)每执行一次,往前移动一个变量
if(max<t)
{
max=t;
}
}
va_end(arg);
return max;
}
int main()
{
int gat;
gat=MAX(5,1,2,3,4,7);
printf("%d",gat);
system("pause");
return 0;
}
程序三:(用可变参数实现printf函数)
#include<stdio.h>
#include<stdarg.h>
void my_printf(char *arr,...)
{
va_list arg;
va_start(arg,arr);
while(*arr)
{
if(*arr=='s')
{
puts(va_arg(arg,char*));//碰到's'则输出字符串
}
if(*arr=='c')
{
putchar(va_arg(arg,char));//碰到'c'则输出一个字符
}
arr++;
}
va_end(arg);
}
int main()
{
my_printf("s ccc","hello",'b','i','t');
system("pause");
return 0;
}
注释1:上文所说的n前而非n后是因为括号中的数字在栈中存储是由高地址向低地址存储的。如下图所示