ANSI C 标准中,有可变参数的概念,可以通过一组宏实现
va_list arg_ptr: 定义一个可变参数列表指针
va_start(arg_ptr, argN): 让arg_ptr指向参数argN
va_arg(arg_ptr, type): 返回类型为type的参数指针,并指向下一个参数
va_copy(dest, src): 拷贝参数列表指针,src->dest,
va_end(arg_ptr): 清空参数列表,并置参数指针arg_ptr无效。每个va_start()必须与一个va_end()对应
参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈
因此,假设定义一个可变参数的函数 void f(int x, ...), 通过f( x, y, z) 调用,那么,z先入栈,然后y, 然后x。 因此我们只要得到任何一个变量的地址,就可以找到其它变量的地址。
va_start(va, n) 就是让va指向n的地址。这样,后面就可以得到所有参数的值。前提是,我们必须知道每个参数的类型。在本例子中,都是int类型。