可變參數是C裡面的一個使用技巧,用宏來實現的,其實主要是根據一個可變參數指針,然後不斷的往後移指針。
但是理解是怎麼用的,還是比較容易的。
[cpp]
#include <stdarg.h>//<SPAN style="COLOR: #ff0000">使用可變參數需要的頭文件</SPAN>
#include <stdio.h>
int max(int count, ...){
va_list ap;//1)定義一個可變參數,這個地方其實是一個指針,用於訪問可變參數中的參數列表
va_start(ap,count);//2)初始化可變參數,並把剛定義的指針指向第一個參數。
int maximum = -1;//假設這都是正整數求最大值,如果不是,就可以把maximum設為最大的負數
int temp,i;
for(i = 0; i < count; i++) {
temp = va_arg(ap, int);//從可變參數列表指針的當前位置獲取一個int型參數,並把指針指向下一個參數。
if(maximum < temp)
maximum = temp;
}
va_end(ap);//結束
return maximum;
}
int main(int argc,char **argv){
int ret_max = max(9,1,6,21,32,5,68,15,32,62);
printf("max in (9,1,6,21,32,5,68,15,32,62) is %d",ret_max);
return 0;
}
#include <stdarg.h>//使用可變參數需要的頭文件
#include <stdio.h>
int max(int count, ...){
va_list ap;//1)定義一個可變參數,這個地方其實是一個指針,用於訪問可變參數中的參數列表
va_start(ap,count);//2)初始化可變參數,並把剛定義的指針指向第一個參數。
int maximum = -1;//假設這都是正整數求最大值,如果不是,就可以把maximum設為最大的負數
int temp,i;
for(i = 0; i < count; i++) {
temp = va_arg(ap, int);//從可變參數列表指針的當前位置獲取一個int型參數,並把指針指向下一個參數。
if(maximum < temp)
maximum = temp;
}
va_end(ap);//結束
return maximum;
}
int main(int argc,char **argv){
int ret_max = max(9,1,6,21,32,5,68,15,32,62);
printf("max in (9,1,6,21,32,5,68,15,32,62) is %d",ret_max);
return 0;
}
基本上使用可變參數,都是這幾步曲:
在調用參數表之前,定義一個 va_list 類型的變量。va_list ap ;
對 ap 進行初始化,讓它指向可變參數表裡面的第一個參數,這是通過 va_start 來實現的,第一個參數是 ap 本身,第二個參數是在變參表前面緊挨著的一個變量;這時候,可以直接把ap作為參數給printf等函數來用的。如:printf(msg,ap);
如果需要自己獲取參數的話,可以調用va_arg,對很多打印的業務來說,這一步不是必須的。調用 va_arg,它的第一個參數是 ap,第二個參數是要獲取的參數的指定類型,然後返回這個指定類型的值,並且把 ap 的位置指向變參表的下一個變量位置;
獲取所有的參數之後,我們有必要將這個 ap 指針關掉,以免發生危險,方法是調用 va_end,他是輸入的參數 ap 置為 NULL,應該養成獲取完參數表之後關閉指針的習慣,這也是一個慣例,並且是國際慣例。