可變參數列表的實現--平均值
c語言中用可變參數列表的原因:
cpp文件中參數可以初始化,則實參中用幾個參數寫幾個,但是c中形參不可以初始化,所以引出可變參數列表,頭文件爲stdarg.h,使用宏stdarg
va_list類型 arg聲明的變量名 eg:va_list arg //訪問參數列表未確定部分
宏stdarg使用了三種宏 :
va_start(arg,val)初始化 //將arg_ptr設置爲傳遞給該函數參數列表的第一個可選參數,\val已確定參數列表最後一個參數
va_arg(arg,int)讀取 //arg_ptr給出的位置檢索type的值,並將arg_ptr指向列表\
中的下一個參數,使用type的範圍確定下一個參數的類型。int是下一個參數的類型
va_end(arg)結束 //重置指向NULL的指針
<span style="font-size:18px;">#include<stdio.h>
#include<stdarg.h>
double average(int val,...)
{
va_list arg;
double sum=0.0;
int i=0;
va_start(arg,val);
for(i=0;i<val;i++)
{
sum+=va_arg(arg,int);
}
va_end(arg);
return sum/val;
}
int main()
{
double ret=average(6,1,2,3,4,5,7);
printf("%f\n",ret);
return 0;
}</span>
測試結果如下圖:ret = (1+2+3+4+5+7)/6
說起可變參數列表我們可以想到printf函數:
如下是函數printf的實現:
#include <stdio.h>
#include<stdarg.h>
int printf(char* format, ...)
{
va_list arg;
va_start(arg, format);
int n;
n = vprintf(format, arg);
va_end(arg);
fprintf(stdout, "\n");
return n;
}
int main()
{
char* aaa = "hello world!";
printf(aaa);
return 0;
}