1. 程式人生 > >可變引數函式分析(va_list,va_start(),va_end())

可變引數函式分析(va_list,va_start(),va_end())

注意:函式引數是以資料結構:棧的形式存取,從右至左入棧。


int add(int num,...)          //num為可變引數的個數
       {
va_list argp;                //typedef char *  va_list
va_start(argp,num);   // #define va_start _crt_va_start  #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
                      //先根據num的地址得到次函式引數在堆疊中的地址(一連串的引數在堆中的地址是連續的),然後得到第一個引數的地址
for(int i=0;i<num;i++)

int temp=va_arg(argp,int); //#define va_arg _crt_va_arg   #define _crt_va_arg(ap,t)   ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
                       //以int型的格式遍歷,在記憶體中的表現形式:以sizeof(int)長度遞增,依次讀取每個函式值
}

va_end(argp);    //#define va_end _crt_va_end        #define _crt_va_end(ap)      ( ap = (va_list)0 )

           //對變數列表的指標賦為空,即不再遍歷