1.不借助函數庫html
void fun(int len,...){數組
int *p=&len;//獲取第一個參數的指針函數
int i=0;指針
p++;htm
for(;i<len;i++){blog
printf("%d",*p);get
}string
}變量
fun(5,2,3,4,5,6);//第一個參數爲輸入的數值個數數據類型
2.藉助函數庫
#include <stdarg.h>
//int型例子
fun(5,2,3,4,5,6);【第一個參數爲輸入參數列表長度,便於獲取參數長度,固然也能夠不使用它(請看int型例子2)】
void fun(int len,...){
va_list ap;//新建參數列表信息數組 其實va_list實質爲char *
va_start(ap,len);//初始化 獲取len以前的參數(參數入棧是從右到左的,因此len是最後一個,也就是棧頂元素)
int val;
for(int i=0;i<len;i++){
val=va_arg(ap,int);//獲取參數信息,第二個參數爲參數列表的數據類型(注意:若是參數列表存'a'、'c'這種字符型右值,會被識別爲int型的),返回值要與參數列表數據類型一致
printf("%d ",val);
}
va_end(ap);//ap置爲NULL
}
//const char* 例子
fun("demo","we","are","programmer","") //咱們依靠指針訪問數據,因此故意留個"",目的是爲了有個結束標誌
fun(const char* flag,..){
va_list ap;
va_start(ap,flag);
char *s;
while(1){
s=va_arg(ap,char *);//省略const
if(strcmp(s,"")){ //比較獲取的參數是否 爲""(即爲最後一個參數,這個做爲結束標誌)//既然用了strcmp就引個string.h的頭吧
break;
}else{
printf("%s ",s);
}
}
}
//int型例子2【多餘的例子能夠不看】
#define END_TARGET 99999999 //好比設置一個END_TARGET做爲結束標誌,每次參數最後都帶一個
fun(5,2,3,4,5,6,END_TARGET);【第一個參數爲輸入參數列表長度,便於獲取參數長度,固然也能夠不使用它(請看int型例子2)】
void fun(int start_target,...){ //不過此時start_target爲廢變量了
va_list ap;//新建參數列表信息數組 其實va_list實質爲char *
va_start(ap,start_target);
int val;
while(1){
val=va_arg(ap,int);//獲取參數信息,第二個參數爲參數列表的數據類型(注意:若是參數列表存'a'、'c'這種字符型右值,會被識別爲int型的),返回值要與參數列表數據類型一致
if(END_TARGET==val){ //取到結束標誌就結束
break;
}
printf("%d ",val);
}
va_end(ap);//ap置爲NULL
}
注意:參數列表能夠不與va_start(參數1<va_list>,參數2<參數列表位置>)參數2不一樣類型
va_list函數的實質
#define va_list char *
#define va_start(p, first) (p = (va_list)&first + sizeof(first))
#define va_arg(p, next) (*(next*)((p += sizeof(next) ) - sizeof(next)))
#define va_end(p) (p = (va_list)NULL)
參考:
https://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html