c可变参数
本文為個(gè)人學(xué)習(xí)筆記,僅供個(gè)人學(xué)習(xí)、復(fù)習(xí)使用。
參考鏈接:鏈接1、鏈接2
在c語(yǔ)言中,我們可以定義這樣的函數(shù),函數(shù)帶有可變數(shù)量的參數(shù)。
int func(int num,...){ . . . } int main(){func(2,2,3); } 1、要注意定義函數(shù)時(shí)函數(shù)的形式; c語(yǔ)言中的printf()函數(shù)其實(shí)也是一個(gè)可變參數(shù)函數(shù),它的原型如下: int printf(const char *format,...);c語(yǔ)言之所以可以支持可變參數(shù)函數(shù),一個(gè)重要的原因是c調(diào)用規(guī)范中規(guī)定c語(yǔ)言函數(shù)調(diào)用時(shí),參數(shù)是從右向左壓入棧的;這樣一個(gè)函數(shù)實(shí)現(xiàn)的時(shí)候,就無(wú)需關(guān)心調(diào)用他的函數(shù)會(huì)傳遞幾個(gè)參數(shù)過(guò)來(lái),而只要關(guān)心自己用到幾個(gè)。如printf()函數(shù): printf("%d%s\n",i,s); printf()函數(shù)在定義的時(shí)候,不知道函數(shù)調(diào)用的時(shí)候回傳遞幾個(gè)參數(shù),在實(shí)現(xiàn)上,printf()函數(shù)只關(guān)心第一個(gè)參數(shù),即字符串"%d"s\n",當(dāng)讀到%d的時(shí)候,printf()知道自己需要第二個(gè)參數(shù),這時(shí)只需要去棧上尋找即可,當(dāng)讀到%s的時(shí)候,再去棧上尋找一個(gè)參數(shù)即可,也就是說(shuō)printf()函數(shù)不關(guān)心棧上到底壓了多少參數(shù),只關(guān)心自己需要多少。 如何實(shí)現(xiàn)可變參數(shù)函數(shù)呢?2、要包含頭文件<stdarg.h>,并注意釋放內(nèi)存。
1、定義一個(gè)函數(shù),最后一個(gè)參數(shù)為省略號(hào),省略號(hào)前面可以設(shè)置自定義參數(shù)。 2、在函數(shù)定義中創(chuàng)建一個(gè)va_list類型變量,該類型是在stdrag.h頭文件中定義 3、使用int參數(shù)和va_start宏來(lái)初始化va_list變量為一個(gè)參數(shù)列表,宏va_start是在stdarg.h頭文件中定義的。 4、使用va_arg宏和va_list變量來(lái)訪問(wèn)參數(shù)列表中的每個(gè)項(xiàng)。 5、使用宏va_end來(lái)清理va_list變量的內(nèi)存。eg:
#include<stdio.h> #include<stdarg.h>double average(int num,...){va_list valist;double sum=0.0;int i;va_start(valist,num);for(i=0;i<num;i++){sum+=va_arg(valist,int);}va_end(valist);return sum/num; }int main(){printf("Average of 2,3,4,5=%f\n",average(4,2,3,4,5));printf("Average of 5,10,15=%f\n",average(3,5,10,15));return 0; }宏va_list、va_arg、va_end定義在stdarg.h中,原型如下: void va_start(va_list ap,last); //取第一個(gè)可變參數(shù)的指針給ap,last是函數(shù)聲明中的最后一個(gè)固定參數(shù) type va_arg(va_list ap,type); //返回當(dāng)前ap指向的可變參數(shù)的值,然后ap指向下一個(gè)可變參數(shù);type表示當(dāng)前可變參數(shù)的類型,支持的類型為int和double void va_end(va_list ap); //將ap置為null 這里要注意一點(diǎn)va_arg()函數(shù)的第二個(gè)參數(shù)不能被指定為char、short、或float。 char、short會(huì)被提升為int,而float會(huì)被提升為double。(這里涉及到整數(shù)提升的問(wèn)題,可百度整數(shù)提升四個(gè)字了解)。總結(jié)
- 上一篇: 新乡做输卵管手术最好的医院推荐
- 下一篇: 颐和园能划船吗