定義如下:
創(chuàng)新互聯(lián)公司主營鄠邑網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app開發(fā)定制,鄠邑h5微信小程序搭建,鄠邑網(wǎng)站營銷推廣歡迎鄠邑等地區(qū)企業(yè)咨詢
函數(shù)返回值 函數(shù)名(形參1, 形參2, ...)
舉例說明:
int??func(int?a,?int?b,?...)
{
//函數(shù)體
......
}
printf()函數(shù)就是一個參數(shù)可變的函數(shù),其函數(shù)原型為:
int?printf?(const?char?*__format,?...);
C語言中可變參函數(shù)實現(xiàn),主要通過VA_LIST宏及相關(guān)操作的幾個宏。
一、涉及宏及說明:
所有相關(guān)宏均定義在stdarg.h中。
1、va_list: 可變參數(shù)列表指針。
2、va_start:獲取可變參數(shù)列表的第一個參數(shù)的地址。
3、va_arg:獲取可變參數(shù)的當前參數(shù),返回指定類型并將指針指向下一參數(shù)。
4、va_end:清空va_list可變參數(shù)列表。
可變參函數(shù)的實現(xiàn),就是這四個宏的使用。
二、代碼舉例:
在實際應用中,經(jīng)常有獲取若干個數(shù)最大值的情況,當數(shù)量比較大的時候,一般通過數(shù)組實現(xiàn),但個數(shù)不多時,一般寫一個max函數(shù)。 常規(guī)寫法都是用到幾個數(shù)的max,就寫幾個參數(shù), 對此可以實現(xiàn)一個可變參數(shù)函數(shù),第一個參數(shù)指定共計有多少數(shù)據(jù),后續(xù)各個參數(shù)為要比較的值。
#include?stdio.h
#include?stdarg.h
int?max(int?n,?...)//可變參數(shù)函數(shù)。
{
int?r,i;
va_list?ap;//定義可變參數(shù)。
if(n?==?0)?return?-1;//異常參數(shù)。
va_start(ap,?n);//得到起始點。
for(i?=?0;?i??n;?i?++)
{
int?v=va_arg(ap,int)?;//獲取下一個參數(shù)值。
if(i?==?0)?r=v;
else?if(rv)?r=v;
}
va_end(ap);//結(jié)束可變參數(shù)。
return?r;//返回結(jié)果。
}
可以用如下主函數(shù)測試:
int?main()
{
printf("%d\n",max(1,?1));
printf("%d\n",max(2,?2,1));
printf("%d\n",max(3,?5,9,?4));
printf("%d\n",max(4,?8?,?3,1,9));
return?0;
}
分別測試了1,2,3,4個數(shù)值,求取最大值的情況。?
測試結(jié)果:
1
2
9
9
#include?stdarg.h??????????//可變參數(shù)函數(shù)必要的頭文件
#include?stdio.h
long?int?sum(unsigned?int?argc,...)????//可變參數(shù)函數(shù)必須包含至少一個確定的參數(shù)
{
long?int?srt=0;
int?va;
unsigned?int?i;
va_list?vl;????????????????????????//用于指向可變參數(shù)列表
va_start(vl,argc);?????????????????//初始化,va_start()調(diào)用的第一個參數(shù)是所編寫的可變參數(shù)函數(shù)的最后一個確定的參數(shù)
for?(i?=?0;?iargc;?i++)?{
srt+=(int)va_arg(vl,int);??????//從參數(shù)列表按提取一個int類型的值參與相加運算
}
va_end(vl);????????????????????????//清理
return?srt;
}
int?main(int?argc,?char*?argv[])
{
printf("%ld\n",sum(3,1,2,3));
return?0;
}