C語言不支持函數重載,但支持可變參數。在 stdarg.h 中提供了3個方法和1個結構。數組
struct va_list,參數列表函數
void va_start(va_list,int); 訪問參數前的準備工做spa
void va_arg(va_list,void);訪問參數,注意參數中的void指數據類型,實際調用時應該是int,float,char等指針
void va_end(va_end);訪問結束後清理工做code
使用過程blog
#include <stdio.h> #include <stdarg.h> int main(){ int sum(int c,...); int c = sum(6,1,2,3,4,5,5); printf("sum = %d\n",c); return 0; } int sum(int c,...){ va_list var_list; int count = 0; va_start(var_list,c); for(;c>0;c--){ count+=va_arg(var_list,int); } va_end(var_list); return count; }
注意:內存
聲明可變參數方法時,第一個參數應爲int,用來代表參數數量,是不能省略的io
我的感受:class
1.可變參數能夠理解爲傳遞給方法一個指針,參數數組的指針,由於數組指針做爲參數,接受參數的方法是不知道數組大小的,因此還要傳遞一個參數數量,這也說明了爲何可變參數的第一個int參數不可省略。數據類型
2.va_start();應該是初始化了一下參數指針,由於沒有這個過程參數訪問就會失敗。
3.va_arg();這個很明顯了,就是指針解引用,並向後移動。
4.va_end();這個也很好理解,確定是釋放內存了,而且銷燬指針。