注意:函数参数是以数据结构:栈的形式存取,从右至左入栈。
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)长度递增,依次读取每个函数值
}
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 )
//对变量列表的指针赋为空,即不再遍历
}