資源描述:
《可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、可變長(zhǎng)參數(shù)函數(shù)(變參函數(shù))技術(shù)分析~
//2011_01_15在C語(yǔ)言中,函數(shù)參數(shù)的傳遞方式有值傳和址傳.值傳是把實(shí)參的一個(gè)專用的、臨時(shí)的復(fù)制值給被調(diào)函數(shù)中相應(yīng)的形參被調(diào)用函數(shù)使用、修改這個(gè)傳來(lái)的復(fù)制值,不會(huì)影響實(shí)參的值.址傳則是把變量(實(shí)參)的地址傳給被調(diào)函數(shù).被調(diào)函數(shù)通過(guò)這個(gè)地址找到該變量的存放位置,直接對(duì)該地址中存放的變量的內(nèi)容進(jìn)行存取操作.因此,在被調(diào)用函數(shù)中可以修改實(shí)參的值.這也是函數(shù)參數(shù)址傳的優(yōu)點(diǎn).無(wú)論是值傳還是址傳,都要求實(shí)參的數(shù)目及類型與形參要完全一致.在一般的程序設(shè)計(jì)語(yǔ)言中,函數(shù)參數(shù)
2、的數(shù)目及類型是不可變的.即函數(shù)被設(shè)計(jì)之后,只能接收已固定個(gè)數(shù)和固定類型的實(shí)參.這樣在編譯時(shí),函數(shù)形參的存儲(chǔ)空間便于確定.但是在C語(yǔ)言中,不但參數(shù)的類型可變,參數(shù)的個(gè)數(shù)也是可變的.也就是說(shuō),在形參表中可以不明確指定傳遞參數(shù)的個(gè)數(shù)和類型,一個(gè)常見(jiàn)的庫(kù)函數(shù)Printf()就是如此.這種函數(shù)稱之為可變長(zhǎng)參數(shù)函數(shù)(變參函數(shù)).可變長(zhǎng)參數(shù)函數(shù)的參數(shù)數(shù)目和類型雖然是可變,但其設(shè)計(jì)原理與固定參數(shù)函數(shù)的設(shè)計(jì)原理是一致的,必須有辦法告訴變參函數(shù)沒(méi)有指定的參數(shù)的個(gè)數(shù)和類型。下面我們通過(guò)對(duì)可變長(zhǎng)參數(shù)函數(shù)的理解和設(shè)計(jì),在教學(xué)中
3、更有助于加深掌握C語(yǔ)言函數(shù)設(shè)計(jì)的思想方法.利用其它語(yǔ)言所不具有的這一可變長(zhǎng)參數(shù)功能,可以開(kāi)發(fā)靈活、方便、簡(jiǎn)潔、功能強(qiáng)的程序模塊.1,可變長(zhǎng)參數(shù)函數(shù)的設(shè)計(jì)方法 stdarg.h解析: stdarg.h是C語(yǔ)言中C標(biāo)準(zhǔn)函式庫(kù)的標(biāo)頭檔,stdarg是由standard(標(biāo)準(zhǔn))arguments(參數(shù))簡(jiǎn)化而來(lái),主要目的為讓函式能夠接收不定量參數(shù)。[1]C++的cstdarg標(biāo)頭檔中也提供這樣的機(jī)能;雖然與C的標(biāo)頭檔是相容的,但是也有沖突存在。 不定參數(shù)函式(Variadicfunctions)是s
4、tdarg.h內(nèi)容典型的應(yīng)用,雖然也可以使用在其他由不定參數(shù)函式呼叫的函式(例如,vprintf)?! ≡跇?biāo)準(zhǔn)文件stdarg.h中包含帶參數(shù)的宏定義typedef?void?*va_list #define?va_arg(ap,type)?(*((type?*)(ap))++) #define?va_start(ap,lastfix)?(ap=…) #define?va_end(ap)例:#include #includevoidprintargs(in
5、targ1,...)/*輸出所有int型態(tài)的參數(shù),直到-1結(jié)束*/ { va_listap; inti; va_start(ap,arg1); for(i=arg1;i!=-1;i=va_arg(ap,int)) printf("%d",i); va_end(ap); putchar(''); }(1)可變長(zhǎng)參數(shù)函數(shù)用規(guī)定格式定義為“類型函數(shù)名(firstfix,…,lastfix,…)”.firstfix,…,lastfix表示函數(shù)參數(shù)列表中的第一個(gè)和最后一個(gè)固定參數(shù),該參數(shù)列
6、表中至少要有一個(gè)固定參數(shù),其作用是為了給變參函數(shù)確定列表中參數(shù)的個(gè)數(shù)和參數(shù)的類型.(2)指針類型va_list用來(lái)說(shuō)明一個(gè)變量ap(argumentpointer——可變參數(shù)指針),此變量將依次引用可變參數(shù)列表中用省略號(hào)“…”代替的每一個(gè)參數(shù).即指向?qū)⒁僮鞯淖儏?(3)宏va_start(ap,lastfix)是為了初始化變參指針ap,以指向可變參數(shù)列表中未命名的第一個(gè)參數(shù),即指向lastfix后的第一個(gè)變參.它必須在指針使用之前調(diào)用一次該宏,參數(shù)列表中至少有一個(gè)未命名的可變參數(shù).從宏定義可知其正確
7、性.(4)宏va_arg(ap,type)調(diào)用,將ap指向下一個(gè)可變參數(shù),而ap的類型由type確定,type數(shù)據(jù)類型不使用float類型.調(diào)用后將新的變參可指向一個(gè)工作變參,如iap=va_start(ap,int)調(diào)用.(5)宏va_end(ap)從stdarg.h中看出定義為空,即未定義.其功能完成清除變量ap的作用,表明程序以后不再使用,若該指針變量需再使用,必須重新調(diào)用宏va_start以啟動(dòng)該變量.2,應(yīng)用舉例 利用上面討論的一般可變長(zhǎng)參數(shù)函數(shù)的設(shè)計(jì)方法,通過(guò)實(shí)例逐步分析其特點(diǎn),以加深函
8、數(shù)實(shí)參與形參一致性的理解.2.1 變參類型相同的函數(shù)#include?#include?int?mul(int?num,int?data1,)//求n個(gè)int型數(shù)的乘積{????int?total?=?data1;????int?arg,i;????va_list?ap;????va_start(ap,data1);????for(i=1;i