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





