詳解可變參數列表

經過一段時間的C語言學習,開始對printf函數產生了好奇,它可以接受不確定數目的參數。我們來看一下他的函數原型:   

       int printf(const char*format,...)

這個其實就是可變參數,我們來看看它的源代碼:

       

int printf(const char*format,...)
       {
          int res;
          va_list(arg);
          va_start(arg,format);
          res=vprintf(format,arg);
          va_end(arg);
          return res;
        }

其實他只是簡單的調用vprintf而已。

我們用一個簡單的例子來理解一下。

求平均數函數的實現。

int average(int val,...)
{
int i=0;
int sum=0;
va_list arg;     //這個就是 char*的意思
va_start(arg,val);
for(i=0;i<val;i++)
{
  sum+=va_arg(arg,int);
}
va_end(arg);
return sum/val;
}

函數中,va_arg(arg,int)的作用就是拿到下一個參數的值。



從函數的實現可以看到,我們使用可變參數應該有以下步驟:
1)首先在函數裏定義一個va_list型的變量,這裏是arg,這個變
量是指向參數的指針.
2)然後用va_start宏初始化變量arg,這個宏的第二個參數是第
一個可變參數的前一個參數,是一個固定的參數.
3)然後用va_arg返回可變的參數,並賦值. va_arg的第二個
參數是你要返回的參數的類型,這裏是int型.
4)最後用va_end宏結束可變參數的獲取.然後你就可以在函數裏使
用第二個參數了.如果函數有多個可變參數的,依次調用va_arg獲
取各個參數.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章