函數壓棧順序是從右往左
可變參數列表
可變參數列表是通過宏來實現的,這些宏定義于stdarg.h頭文件,它是標準庫的一部分。這個頭文件聲明了一個類型va_list和三個宏——va_start、va_arg和va_end。我們可以聲明一個類型為va_list的變量,與這幾個宏配合使用,訪問參數的值。(注意:可變參數必須從頭到尾的按照順序逐個訪問??梢栽谠L問幾個參數后終止,但不能一開始就訪問參數列表中間的參數。另外,由于參數列表中的可變參數部分沒有原型,所以,所有作為可變參數傳遞給函數的值都將執(zhí)行默認參數類型提升)
/*
*計算指定數量的值的平均值
*/
#includefloat?average(int?n_values?,?...)
{
va_list?var_arg;
int?count;
float?sum?=?0;
//準備訪問可變參數
va_start(?var_arg,?n_values?);
//添加取自可變參數列表的值
for(?count?=?0;?count?<?n_values;?count?+=1)
{
sum?+=?va_arg(?var_arg,?int?);
}
//完成處理可變參數
va_end(?var_arg?);
return?sum?/?n_values;? ? 函數聲明了一個名叫var_arg的變量,用于訪問參數列表的未確定部分。這個變量通過調用va_start來初始化。它的第一個參數是va_list變量的名字,第二個參數是省略號前最后一個有名字的參數。初始化過程吧var_arg變量指向可變參數部分的第1個參數。
? ? 為了訪問參數,需要使用va_arg,這個宏接受兩個參數:var_list參數和參數列表中下一個參數的類型。va_arg返回這個參數的值,并使var_arg指向下一個可變參數。
? ? 最后,當訪問完畢最后一個可變參數之后,需要調用va_end。





