C语言可变参数实现函数重载

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()对应

 


 

#include<stdio.h> #include<stdarg.h> int getMax(int n, ...) { va_list va; va_start(va,n); // init va, pointing to the first argument int tmp,smax=-1; int i; for(i=0;i<n;i++) { tmp=va_arg(va,int); // get the next argument, the type is int if(tmp>smax) smax=tmp; } va_end(va); return smax; } int main() { printf("%d/n",getMax(4,9,5,2,19)); printf("%d/n",getMax(6,1,3,4,5,2,0)); } 

 

参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈

因此,假设定义一个可变参数的函数 void f(int x, ...), 通过f( x, y, z) 调用,那么,z先入栈,然后y, 然后x。 因此我们只要得到任何一个变量的地址,就可以找到其它变量的地址。

va_start(va, n) 就是让va指向n的地址。这样,后面就可以得到所有参数的值。前提是,我们必须知道每个参数的类型。在本例子中,都是int类型。

 

你可能感兴趣的:(c,list,ini,语言)