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