可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析

可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析

ID:12677857

大小:158.50 KB

頁(yè)數(shù):8頁(yè)

時(shí)間:2018-07-18

可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析_第1頁(yè)
可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析_第2頁(yè)
可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析_第3頁(yè)
可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析_第4頁(yè)
可變長(zhǎng)參數(shù)函數(shù) 實(shí)現(xiàn)解析_第5頁(yè)
資源描述:

《可變長(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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。