可變參數列表,指的是函數的參數個數是可變的,但我們寫一個子函數實現某個功能的時候,我們通常通過實參和形參的形式把參數傳遞給子函數。而可當我們使用va_list變參數列表的時候形參和實參的傳遞就變得相對靈活了。我們通過兩個簡單的函數比較二者區別。
常規的實參形參一一對應的形式相信大家都爛熟於心了,這裏就不寫了。我們來看看用可變參數列表寫的求和還有找最值。
#define _CRT_SECURE_NO_DEPRECATE 1
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
int sum(int n, ...)
{
va_list arg;
int i = 0;
int tmp = 0;
va_start(arg,n);
for(i=0; i<n; i++)
{
tmp+=va_arg(arg,int);
}
va_end(arg);
return tmp;
}
int Max(int n, ...)
{
int i = 0;
int max=0;
va_list arg;
va_start(arg,n);
max = va_arg(arg,int);
for(i=0; i<n-1; i++)
{
int tmp = va_arg(arg,int);
if(max<tmp)
{
max = tmp;
}
}
return max;
}
int main()
{
int ret = 0;
ret = sum(3,3,3,4);
printf("求和結果爲 :%d \n",ret);
ret = Max();
printf("最大值爲 :%d \n",ret);
system("pause");
return 0;
}
在使用可變參數列表的時候有一點值得注意:1 每調用一次va_arg(),可變參數列表的指針就會自動指向下一個參數,在尋找最大值的子函數實現是就先用tmp將可變參數先保 存起來,再經過比較tmp和max最後賦值,如果是直接把可變參數和max比較,再調用va_arg()賦值的話其實是把可變參數接 來的那個參數賦給了max而不是你想賦的那個值。
2 在使用其元素的時候 必須是連續的,不能出現跳變。