C语言_函数可变参数列表

函数可变参数列表的应用和原理

在网上看到各位前辈关于这部分的介绍有些是过于简洁,有些则是过于晦涩,有的代码拿出来甚至在编译器上跑不过去,所以在这里讲一下自己对于可变参数的认识,若有不正确的地方,欢迎各位网友指出来,以便不断修正这块的内容。

————————————————————————————————————
我们平常在使用函数传参时,往往会传进去固定的参数,我在这里举一个设计函数求几个数最大值的栗子:

#include<stdio.h>
#include<windows.h>
int my_max(int x,int y,int z)
{
    int max=0;
    if(x>y)
        max=x;
    else
        max=y;
    if(max>z)
        return max;
    else
        return max=z;
}
int main()
{
    int a=12;
    int b=21;
    int c=121;
    printf("a=%d,b=%d,c=%d\n",a,b,c);
    printf("max=%d",my_max(a,b,c));
    system("pause");
    return 0;
}

从这个例子中我们可以看到他的局限性就在于,传进去的参数的个数是固定的,也就是这个my_max函数只能用于求三个数的最大数,以后若是想要求更多数的最大数,就不得不重新设计函数。所以,我们可以应用函数可变参数来避免这一局限性,下面我用可变参数的方式再写一遍这个函数:

#include<stdarg.h>
//交换两个变量的值
void swap(int *x,int *y)
{
    *X^=*y;
    *y^=*x;
    *x^=*y;
}
int my_max(int values,...)//注意此处的逗号后面是三个英文句号!
{
    int i=0;
    int max=0;
    va_list varg;//注意此处的varg是一个随意起的变量名
    va_start(varg,values);
    for(;i<values;i++)
    {
        int num=0;
        num=va_arg(varg,int);
        if(max<num)
            swap(&max,&num);
    }
    va_end(varg);
    return max;
}

这个函数在调用的时候是这样传参的:

my_max(n_values,x,y,z……);


下面我来解释一下函数可变参数用法原理
——————————————————————————

va_list定义了一个指针(即varg), 而在c语言中,函数调用时,参数是从右向左依次压入栈中的(每个函数在调用的时候都会形成一个帧栈结构),所以这个指针依次可以指向所有的函数,直至结束。知道了这个,就不难理解为什么可以依次遍历函数的参数了。

再来看va_start(),这个是获取函数可变参数里的第一个参数,从此处我们也可以想到,被调用函数的参数列表里,至少要有一个命名参数。如果 连一个命名参数也没有,那么就无法使用va_start()了 。

最后一定要记得va_end(),来关闭这个指针。

在应用可变参数的时候还要注意这两个问题

——————————————————————————
1. 在调用函数时,要自己加上参数的数量,因为这些宏无法判断实际存在的参数的数量,如果你没加,那么编译器就会报错。
2. 一定要注意传进去参数的类型是否符合你所想要的,因为这些宏无法自己判断每个参数的类型,结果是不可预知的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值